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

标签 c++ c++11

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

根据 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>

Live demo

关于c++ - 有没有办法将一对元组剥离为可变参数模板类型或使用可变参数类型实例化某些内容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57782366/

相关文章:

c++11 - 无法将 std::chrono::duration 与零进行比较

c++ - 在 lambda 函数中使用 auto self(shared_from_this()) 变量的原因是什么?

c++ - 内存溢出的Dtrace?

c++ - 在数组中获取和存储内存地址的问题

c++ - volatile 和 virtual 成员如何影响 C++ 合成移动构造函数?

c++ - 为什么这个 SFINAE 在 gcc 中会报错?

c++ - 如何获取元组 C++ 的前 N ​​个元素?

c++ - 将对象从 C++ 代码传递到回调函数

c++ - 是否可以构造一个 "infinite"字符串?

c++ - cout不是std的成员,其他关于c++的问题