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++ - 如果 switch 语句达到默认值,则重复 do while 循环

c++ - 为什么当我使用不同版本的 GCC 时使用 strtok 函数时出现此错误?

c++ - 如何确定一个类型是否可以仅使用 const 引用调用?

c++ - 如果表达式的求值需要对引用求值,为什么表达式不是 "core constant expression"?

c++ - 将一个元组重新映射到另一个元组

c++ - 使用&符号后跟下划线命名的变量是什么意思?

c++ - OpenCV 3 HOG 检测信心?

c++ - 我可以在不指定所有模板参数的情况下使用 std::set 构造函数指定比较器吗

c++ - 通用 vector 类中的重载解析问题

c++ - 如何将宏生成的#foo 字符串传递给模板类?