将std :: variant转换为模板类实例的std :: tuple

Ale*_*sky 4 c++ c++17

transform_v2t 下面代码中的function构建模板类A实例的元组:

template <typename T>
struct A
{
    T val;
};

template <class V, template <class> class T, std::size_t... index>
inline constexpr auto transform_v2t(std::index_sequence<index...>)
{
    return std::make_tuple(T<std::variant_alternative_t<index, V>>() ...);
}

template <class V, template <class> class T>
inline constexpr auto transform_v2t()
{
    return transform_v2t<V, T>(std::make_index_sequence<std::variant_size_v<V>>());
}

typedef std::variant<bool, char, int, float, double, std::string> V;

int main()
{
    auto t1 = transform_v2t<V, A>();
}
Run Code Online (Sandbox Code Playgroud)

是否可以将相同的transform_v2t函数应用于具有两个模板参数的类,例如:

template <typename P, typename T>
struct B
{
    P other_val;
    T val;
};
Run Code Online (Sandbox Code Playgroud)

与P专业化为int

用伪代码可以是这样的:

template <class T> typedef B<int, T> PartiallySpecializedB;
auto t2 = transform_v2t<V, PartiallySpecializedB>();
Run Code Online (Sandbox Code Playgroud)

请参阅在线示例代码

Bar*_*rry 6

切勿typedef在C ++ 11后的代码中使用,始终首选using(称为别名声明)。

它们不但更易于阅读,因为您要声明的名称在左侧(而不是...随处可见):

using V = std::variant<bool, char, int, float, double, std::string>;
Run Code Online (Sandbox Code Playgroud)

...但是它们也支持别名模板声明:

template <class T> 
using PartiallySpecializedB = B<int, T>;

auto t2 = transform_v2t<V, PartiallySpecializedB>();
Run Code Online (Sandbox Code Playgroud)

  • @AlexeyStarinsky在语义方面?否。在可读性方面?是。 (6认同)