是否可以制作根据N扩展元组参数的宏?就像我们需要带"3 int"的元组一样。所以我们只写m(3(,它变成"int,int,int">
const int k = 3;
#define m(N) int, int, int //how to write int, int, int here in cycle?
typedef std::tuple<m(k)> new_type;
还有别的办法吗?
您可以定义一个函数,该函数返回一个具有给定T
类型重复N
次的元组:
template<class T, size_t ... indices>
auto helper(std::index_sequence<indices...>) {
return std::tuple_cat( (indices,std::tuple<T>())... );
}
template<class T, size_t N>
auto genTuple() {
return helper<T>(std::make_index_sequence<N>{});
}
然后,定义别名模板获取类型和重复次数:
template<class T, size_t N>
using Tuple = decltype(genTuple<T,N>());
通过decltype,您可以获得函数的返回类型-您所需的元组。
用法:
Tuple<int,3> t;
现场演示
尽管您可以执行一些REPEAT MACRO(将转发到REPEAT_3、REPEAT_2和REPEAT_1(,并且会有一些硬编码限制,
您可以使用模板来生成,例如:
template <typename T, std::size_t> using always_t = T;
template <typename T, typename Seq> struct gen_tuple_helper;
template <typename T, std::size_t ... Is>
struct gen_tuple_helper
{
using type = std::tuple<always_t<T, Is>...>;
};
template <typename T, std::size_t N>
using gen_tuple_t = typename gen_tuple_helper<T, std::make_index_sequence<T>>::type;
static_assert(std::is_same_v<std::tuple<int, int, int>, gen_tuple_t<int, 3>>);
注意:正如评论中所指出的,同构的std::tuple
可能会被std::array
取代,这似乎更容易操作。