元组参数的宏

  • 本文关键字:参数 元组 c++
  • 更新时间 :
  • 英文 :


是否可以制作根据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取代,这似乎更容易操作。

最新更新