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

标签 c++

我需要检查元组的第 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/

相关文章:

c++ - 如何保护应用程序免受 DLL 模块中的错误

c++ - 如何在 C++ 中实现进程全局变量?

c++ - 如何正确地从 shared_ptr 移动/读取

C++11 match_regex 不匹配简单模式

c++ - 结构的内存大小

c++ - 将 C++ 模板参数限制为子类

c++ - 为什么在 C++ 中如此频繁地使用 get/set 函数?

c++ - 如果 list::remove() 用于不存在的元素,会返回什么?

c++ - 代码即使在删除后仍继续显示变量

c++ - 双向链表未读取整个 txt 文件