C++ 生成包含给定类型N个参数的可变参数列表的最佳方法?

C++ 生成包含给定类型N个参数的可变参数列表的最佳方法?,c++,templates,variadic-templates,C++,Templates,Variadic Templates,表单中有一个类模板: template <typename ...T> Bag {}; 然后使用中间类将TypeSequence转换为可变参数列表: template <typename T> class UniBagHelper {}; template <typename ... T> class UniBagHelper<TypeSequence<T ...>> : public Bag<T ...> {}; te

表单中有一个类模板:

template <typename ...T> Bag {};
然后使用中间类将
TypeSequence
转换为可变参数列表:

template <typename T> class UniBagHelper {};
template <typename ... T> class UniBagHelper<TypeSequence<T ...>> : public Bag<T ...> {};

template <typename T, size_t N> class UniBag : public UniBagHelper<GenTypeSeq<T, N>> {};

UniBag<bool, 4> logicBag;
模板类UniBagHelper{};
模板类UniBagHelper:公共包{};
模板类UniBag:public UniBagHelper{};
单袋逻辑袋;

大概是这样的:

template <typename T, size_t dummy>
using EatIndex = T;

template <typename T, std::size_t... I>
Bag<EatIndex<T, I>...> MakeBagN(std::index_sequence<I...>);

template<size_t N, typename T>
using BagN = decltype(MakeBagN<T>(std::make_index_sequence<N>()));

template<size_t N, typename T>
class UniBag : public BagN<N, T> {};
模板
使用指数=T;
模板
制袋(标准:索引顺序);
模板
使用BagN=decltype(MakeBagN(std::make_index_sequence());
模板
类UniBag:公共BagN{};

C++14引入了,因此您可以直接使用:

template <typename T, std::size_t> using always_t = T;

template <typename T> struct BagTNHelper;

template <typename T, std::size_t ... Is>
struct BagTNHelper<T, std::index_sequence<Is ...>>
{
    using type = Bag<always_t<T, Is>...>;
};

template <typename T, size_t N>
using BagTN = typename BagTNHelper<T, std::make_index_sequence<N>>::type;
模板始终使用\u t=t;
模板结构;
模板
结构BagTNHelper
{
使用类型=袋;
};
模板
使用BagTN=typename bagtnheloper::type;
然后

using BoolBag3 = BagTN<bool, 3>; // Bag<bool, bool, bool>
using IntBag2 = BagTn<int, 2>; // Bag<int, int>
使用BoolBag3=BagTN;//纸袋
使用IntBag2=BagTn;//纸袋

我想你可以在《谢谢》上找到更好的答案<代码>EatIndex…是我错过的技巧。decltype的使用也很简洁。谢谢<代码>总是…是我所缺少的。我猜这是用其他参数替换类型/值模板参数的一般方法。
template <typename T, size_t dummy>
using EatIndex = T;

template <typename T, std::size_t... I>
Bag<EatIndex<T, I>...> MakeBagN(std::index_sequence<I...>);

template<size_t N, typename T>
using BagN = decltype(MakeBagN<T>(std::make_index_sequence<N>()));

template<size_t N, typename T>
class UniBag : public BagN<N, T> {};
template <typename T, std::size_t> using always_t = T;

template <typename T> struct BagTNHelper;

template <typename T, std::size_t ... Is>
struct BagTNHelper<T, std::index_sequence<Is ...>>
{
    using type = Bag<always_t<T, Is>...>;
};

template <typename T, size_t N>
using BagTN = typename BagTNHelper<T, std::make_index_sequence<N>>::type;
using BoolBag3 = BagTN<bool, 3>; // Bag<bool, bool, bool>
using IntBag2 = BagTn<int, 2>; // Bag<int, int>