我有一个模板类,它采用
std::variant
作为模板参数:
template<class T>
class X
{
};
X<std::variant<int, float>> x;
我想为
T
添加一个约束,以从 std::variant
派生。
然后我想提取这个变体的模板参数以在类中使用它们。
像这样:
template<class T, std::enable_if_t<
std::is_base_of_v<std::variant<T::_Types>, T>, // _Types = int, float
bool> = true>
class X
{
std::tuple<T::_Types> t; // std::tuple<int, float>
};
X<std::variant<int, float>> x;
问题是我无法从
int, float
类型获取这些 variant
参数。
有没有办法在 C++17 中做到这一点?
这个变体来自函数的返回类型。 因此,我无法将其更改为变体参数之类的东西(直接采用
int, float
)。
tuple_types
类型特征为构成模板类T
专业化的不同类型提供专门的元组,否则提供空元组。为简单起见,使用标准 std::tuple
。
要实现该技术,添加接受泛型类及其模板参数列表的部分专业化就足够了。
示例:
template <typename>
struct tuple_types
{ using type = std::tuple<>; };
template <template <typename...> typename T, typename ...Args>
struct tuple_types<T<Args...>>
{ using type = std::tuple<Args...>; };
template <typename T>
using tuple_types_t = typename tuple_types<T>::type;
在您的情况下,可以提取模板参数列表并直接在代码中使用它,而不是创建这样的元组。