推导 std::variant 模板参数的模板参数

问题描述 投票:0回答:1

我有一个模板类,它采用

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
)。

templates c++17 variant
1个回答
0
投票

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;

在您的情况下,可以提取模板参数列表并直接在代码中使用它,而不是创建这样的元组。

© www.soinside.com 2019 - 2024. All rights reserved.