[英]How do i assert, compile time, that the nth element of a tuple is an optional of some type?
我需要检查元组的第 n 个元素是否是某种类型的可选元素。 它必须是 std::optional 而不是 std::variant (这可以使代码更简单)。
我的第一直觉如下。 但这会引发编译器错误。
template<int N, typename TupleToCheck>
void StaticCheck() {
using NthType = typename tuple_element<N, TupleToCheck>::type;
static_assert(std::is_same<NthType, std::optional<NthType::value_type>>);
}
我怀疑这是因为编译器不知道 NthType 是否可以在其中定义类型value_type
。 有没有办法实现这一目标?
您没有发布错误,但无论::value_type
是否存在,此方案都应适用于所有模板:
#include <tuple>
#include <optional>
template<typename T>
struct is_optional{
constexpr static bool value = false;
};
template<typename T>
struct is_optional<std::optional<T>>{
constexpr static bool value = true;
};
template<typename T>
constexpr bool is_optional_v = is_optional<T>::value;
template<int N, typename TupleToCheck>
void StaticCheck() {
static_assert(is_optional_v<std::tuple_element_t<N,TupleToCheck>>);
}
int main(){
using t1 = std::tuple<int,std::optional<double>,double>;
StaticCheck<1,t1>();
}
为了结束,回答我自己的问题。
正如@DanielLangr 在评论中指出的那样,我的代码存在语法问题。
如果我纠正语法错误,它对我有用(没有编译错误):godbolt.org/z/dxndEx。 添加了 std::、typename 和 ::value。
固定代码如下
template<int N, typename TupleToCheck>
void StaticCheck() {
using NthType = typename std::tuple_element<N, TupleToCheck>::type;
static_assert(std::is_same<NthType, std::optional<typename NthType::value_type>>::value);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.