如何在C++中创建自定义整数序列

wan*_*mer 6 c++ templates variadic-functions variadic-templates c++11

我有这样的功能:

template <typename ... Types>
void foo(const Types & ... values)
{
    // expected that 'values' is sequence like
    // '1, customvalue1, 2, customvalue2, 3,...'
}
Run Code Online (Sandbox Code Playgroud)

第二个功能:

template <typename ... Types>
void bar(const Types & ... values)
{
    // where 'values' are any variables
    // some magic here
    foo((int_seq<sizeof...(Types)>, values)...);
}
Run Code Online (Sandbox Code Playgroud)

我想将任何变量序列传递给bar,以便此序列转换为'1,value1,2,value2,3,value3'等序列.因此,每个值都遵循基本序列中的数字.但我不能创建这个"魔术代码"来在这两个状态之间的编译阶段转换序列.

max*_*x66 1

不是很优雅,但是使用元组std::tie等等......

以下示例应适用于 C++11

- - 编辑 - -

修改和统一(没有 C++14 元素的 C++11)我的第一个示例。

不需要(可以使用std::index_sequence平凡的代替)或(可以使用 逐步构建索引序列);不再需要了。struct indSeqstd::make_index_sequencesizeof...(I)qux()

#include <tuple>
#include <iostream>


void foo ()
 { }

template <typename T0, typename ... Types>
void foo (const T0 & v0, const Types & ... values)
 {
   std::cout << "-- " << v0 << std::endl;

   foo(values...);
 }


template <std::size_t ...>
struct indSeq
 { };

template <std::size_t ... Is, typename ... Ts1>
void baz (std::size_t, const indSeq<Is...> &, const std::tuple<Ts1...> & t)
 { foo(std::get<Is>(t)...); }

template <std::size_t ... Is, typename ... Ts1, typename T0, typename ... Ts2>
void baz (std::size_t n, const indSeq<Is...> &, const std::tuple<Ts1...> & t,
          const T0 & v0, const Ts2 & ... vs)
 { baz(n+1U, indSeq<Is..., sizeof...(Is), sizeof...(Is)+1U>(),
       std::tuple_cat(t, std::tie(n), std::tie(v0)), vs...); }

template <typename ... Types>
void bar (const Types & ... values)
 { baz (1U, indSeq<>(), std::tuple<>(), values...); }

int main()
 {
   bar(11, 22L, "33", 44.44);
   return 0;
 }
Run Code Online (Sandbox Code Playgroud)

ps:抱歉我的英语不好。