繁体   English   中英

我如何在编译时断言元组的第 n 个元素是某种类型的可选元素?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM