c++ - 需要模板的特定特化作为模板参数

标签 c++ templates c++17 template-specialization typetraits

我有一个数据结构 meta_array,它是用一个变体作为类型 T 参数实例化的。要求是 std::variant 特化必须包含 meta_array_head_t 类型,因为它用于跟踪信息。我能否以某种方式将此声明为使用类型特征 (C++17) 的要求?

CompilerExplorer :

#include <cstdio>
#include <variant>
#include <array>

struct meta_array_head_t {
    // end_;
    // remaining_;
    // prev_;
};

template <typename T, size_t S> // make sure T = std::variant<... , meta_array_head_t, ...>
struct meta_array
{
    std::array<T, S> data_; 
};


using val = std::variant<std::monostate, int, double, meta_array_head_t>;

int main()
{
    meta_array<val, 100> marray;
}

最佳答案

首先判断Tstd::variant类型,然后使用折叠表达式检测替代类型是否包含meta_array_head_t

#include <variant>

template<typename T>
struct meta_variant : std::false_type { };

template<typename... Ts>
struct meta_variant<std::variant<Ts...>> : 
  std::bool_constant<((std::is_same_v<Ts, meta_array_head_t> || ...))> { };

template <typename T, size_t>
struct meta_array {
  static_assert(meta_variant<T>::value, 
    "T must be a std::variant specialization "
    "containing an alternative type of meta_array_head_t.");
};

Demo

关于c++ - 需要模板的特定特化作为模板参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73061512/

相关文章:

C++ 嵌套 `namespace` `using` Name Lookup Order of Preference

C++17:如何控制执行策略中的线程数?

c++ - 与 SFINAE 中的硬错误混淆

c# - 使用 COM Callable Wrapper 处理 firebreath PluginAPI.cpp 中的 c# 触发事件

c++ - ffmpeg和代码生成的碎片化mp4文件的区别

c++ - 是否可以在编译时检测函数的默认参数?

c++ - 函数模板和模棱两可的模板参数

c++ - 构造函数带参数时如何实例化模板类

c++ - C++17 中新的基于范围的 for 循环如何帮助 Ranges TS?

c++ - 为什么不能 move 这些变量?