我有一个数据结构 meta_array
,它是用一个变体作为类型 T 参数实例化的。要求是 std::variant 特化必须包含 meta_array_head_t
类型,因为它用于跟踪信息。我能否以某种方式将此声明为使用类型特征 (C++17) 的要求?
#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;
}
最佳答案
首先判断T
是std::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.");
};
关于c++ - 需要模板的特定特化作为模板参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73061512/