我需要检查元组的第 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>();
}
关于c++ - 我如何在编译时断言元组的第 n 个元素是某种类型的可选元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64035637/