有没有办法将一对元组剥离为可变参数模板类型或使用可变参数类型实例化某些内容?

rez*_*brh 5 c++ c++11

我有一个tupleof pairs,其中每对都有一个固定类型和一个变体类型。我想要的是一个变体类型列表或用这些类型定义一个对象(它肯定是用可变参数模板包构造的)。

根据How do I strip a tuple<>back into a variadic template list of types? ,可以用 的构成类型实例化某些东西tuple。但在这种情况下,我不知道这是否可能,如果可能,我不知道该怎么做。

想象一下我有这样的事情:

struct MyFixedType
{ /* ... */ };


using Tuple = std::tuple<
    std::pair<MyFixedType, int>,
    std::pair<MyFixedType, double>,
    std::pair<MyFixedType, std::string>
>;
Run Code Online (Sandbox Code Playgroud)

我有这门课:

template <typename... Ts>
class MyClass
{
};
Run Code Online (Sandbox Code Playgroud)

我要的是申报对象MyClass<int, double, std::string>

注意:虽然这种情况可以使用预处理器或一些宏来处理,但我不允许使用宏。

Que*_*tin 2

为了简洁起见,使用函数模板参数推导:

template <class Fixed, class... Variant>
MyClass<Variant...> MyClassFromPairTuple_impl(std::tuple<std::pair<Fixed, Variant>...> &&);

template <class Tuple>
using MyClassFromPairTuple = decltype(MyClassFromPairTuple_impl(std::declval<Tuple>()));
Run Code Online (Sandbox Code Playgroud)

用法:

using Tuple = std::tuple<std::pair<MyFixedType, int>, std::pair<MyFixedType, double>, std::pair<MyFixedType, std::string>>;

MyClassFromPairTuple<Tuple> instance; // MyClass<int, double, std::string>
Run Code Online (Sandbox Code Playgroud)

现场演示