相关疑难解决方法(0)

在可变参数模板的上下文中,"..."标记的规则是什么?

在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)...同时使用Argsargs,但只有一个...令牌.此外,std::forward是一个非可变参数模板函数,只接受一个模板参数和一个参数.那个(大致)的语法规则是什么?如何概括?

另外:在函数实现中,省略号(...)位于感兴趣的表达式的末尾.有没有理由在模板参数列表和参数列表中省略号位于中间?

c++ variadic-templates c++11

96
推荐指数
2
解决办法
3566
查看次数

有人可以解释一下"指数技巧"吗?

我注意到在精美打印元组的上下文中提到了"索引技巧".这听起来很有趣,所以我按照链接.

嗯,那不顺利.我理解了这个问题,但实际上并不能跟踪发生的事情.为什么我们甚至需要任何指数?那里定义的不同功能如何帮助我们?什么是'裸露'?等等

有人可以为参数包和可变元组的专家提供那种东西的游戏吗?

c++ tuples indices variadic-templates c++11

14
推荐指数
1
解决办法
3351
查看次数

可变参数模板 - 参数包扩展理解

我很难理解参数包扩展。让我困惑的是点何时出现在右侧以及何时点出现在左侧。我发现这篇文章对我有一点帮助。假设我有以下两个例子

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++ templates variadic-templates c++11

6
推荐指数
1
解决办法
1718
查看次数

数组元素到Variadic模板参数

我有一个关于如何完成以下行为的问题,或者在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在编译时设置.

c++ variadic-templates c++11

1
推荐指数
1
解决办法
286
查看次数

标签 统计

c++ ×4

c++11 ×4

variadic-templates ×4

indices ×1

templates ×1

tuples ×1