gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 09:01:35 24 4
gpt4 key购买 nike

我有一个数据结构 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com