我有一个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>
>;
我有这门课:
template <typename... Ts>
class MyClass
{
};
我要的是申报对象MyClass与<int, double, std::string>
注意:虽然这种情况可以使用预处理器或一些宏来处理,但我不允许使用宏。
为了简洁起见,使用函数模板参数推导:
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>()));
用法:
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>