在C++ 11中有像这样的可变参数模板:
template< class T, class... Args >
unique_ptr<T> make_unique( Args&&... args )
{
return unique_ptr<T>(new T(std::forward<Args>(args)...));
}
Run Code Online (Sandbox Code Playgroud)
有一些好奇这个问题:表达std::forward<Args>(args)...同时使用Args和args,但只有一个...令牌.此外,std::forward是一个非可变参数模板函数,只接受一个模板参数和一个参数.那个(大致)的语法规则是什么?如何概括?
另外:在函数实现中,省略号(...)位于感兴趣的表达式的末尾.有没有理由在模板参数列表和参数列表中省略号位于中间?
我注意到在精美打印元组的上下文中提到了"索引技巧".这听起来很有趣,所以我按照链接.
嗯,那不顺利.我理解了这个问题,但实际上并不能跟踪发生的事情.为什么我们甚至需要任何指数?那里定义的不同功能如何帮助我们?什么是'裸露'?等等
有人可以为参数包和可变元组的专家提供那种东西的游戏吗?
我很难理解参数包扩展。让我困惑的是点何时出现在右侧以及何时点出现在左侧。我发现这篇文章对我有一点帮助。假设我有以下两个例子
Example 1:
template <class ...A> --> line 1
int func(A... arg) --> line 2
{
return sizeof...(arg);
}
int main(void)
{
return func(1,2,3,4,5,6);
}
Run Code Online (Sandbox Code Playgroud)
我相信我上面提到的帖子提到了黑白差异...A,并且A...第一个帖子进行左侧扩展,第二个帖子进行右侧扩展。我不确定这意味着什么。谁能澄清一下扩展后的样子。到目前为止,我唯一了解的关于右侧点的例子是这样的
//Foo and bar are variadic parameter packs
Foo... => Foo1, Foo2, Foo3, etc
std::vector<Foo>... => std::vector<Foo1>, std::vector<Foo2>, std::vector<Foo3>, etc.
std::tuple<Foo...>(bar...) => std::tuple<Foo1, Foo2, Foo3, etc>(bar1, bar2, bar3, etc)
&bar... => &bar1, &bar2, &bar3, etc
Run Code Online (Sandbox Code Playgroud)
谁能澄清一下第 1 行和第 2 行中的点扩展到什么以及左侧扩展和右侧扩展之间有什么区别?
我有一个关于如何完成以下行为的问题,或者在C++中是否可行.假设我有这种可变函数
template<typename T, typename...Pack>
T sum(T a, Pack... pack) {
return a + sum(pack...);
}
template<typename T>
T sum(T a) {
return a;
}
Run Code Online (Sandbox Code Playgroud)
然后我有一个数组
double array[5];
Run Code Online (Sandbox Code Playgroud)
有没有办法可以做类似的事情
sum(array[0], array[1], array[2], array[3], array[4]);
Run Code Online (Sandbox Code Playgroud)
没有明确地对每个元素进行硬编码?原因,我正在尝试实现诸如此类的东西,
double array[N];
sum(array[0], array[1], array[2], ..., array[N-1]);
Run Code Online (Sandbox Code Playgroud)
其中N在编译时设置.