前提:
在稍微使用了可变参数模板之后,我意识到实现稍微超出简单的元编程任务的任何东西很快变得非常麻烦.特别是,我发现自己希望的执行方式上的参数包一般操作如迭代,拆分,循环在一个std::for_each样的方式,等等.
在观看了由安德烈Alexandrescu的本次讲座由C++和超越2012年的愿望static if成C++(从借来构建d编程语言),我的感觉是某种static for会来得心应手,以及-我觉得更多的这些的static结构能带来好处.
所以我开始想知道是否有办法为变量模板函数(伪代码)的参数包实现类似的东西:
template<typename... Ts>
void my_function(Ts&&... args)
{
static for (int i = 0; i < sizeof...(args); i++) // PSEUDO-CODE!
{
foo(nth_value_of<i>(args));
}
}
Run Code Online (Sandbox Code Playgroud)
哪个会在编译时被翻译成这样的东西:
template<typename... Ts>
void my_function(Ts&&... args)
{
foo(nth_value_of<0>(args));
foo(nth_value_of<1>(args));
// ...
foo(nth_value_of<sizeof...(args) - 1>(args));
}
Run Code Online (Sandbox Code Playgroud)
原则上,static_for将允许更精细的处理:
template<typename... Ts>
void foo(Ts&&... args)
{
constexpr s …Run Code Online (Sandbox Code Playgroud) c++ iteration template-meta-programming variadic-templates c++11
如何将参数包拆分为两个相等的部分?
例如,我想做这样的事情:
template<typename T> T sum(const T& t)
{ return t; }
template<typename T> T sum(const T& t1, const T& t2)
{ return t1 + t2; }
template<typename ...T> T sum(T&& ...t)
{ sum(first_half(t)...) + sum(second_half(t)...); }
Run Code Online (Sandbox Code Playgroud)