我想更好地理解参数包扩展,所以我决定研究一下,曾经对我来说很明显的东西,在试图理解到底发生了什么之后不再那么明显了。让我们检查一个标准的参数包扩展std::forward:
template <typename... Ts>
void foo(Ts&& ... ts) {
std::make_tuple(std::forward<Ts>(ts)...);
}
Run Code Online (Sandbox Code Playgroud)
我的理解是,对于任何参数 pack Ts,std::forward<Ts>(ts)...将导致以逗号分隔的转发参数列表及其相应类型,例如,对于tsequal 1, 1.0, '1',函数体将扩展为:
std::make_tuple(std::forward<int&&>(1), std::forward<double&&>(1.0), std::forward<char&&>('1'));
Run Code Online (Sandbox Code Playgroud)
这对我来说很有意义。与函数调用一起使用的参数包扩展会生成以逗号分隔的调用该函数的列表,并带有适当的参数。
似乎困扰我的是operator,,如果我们想以类似的方式调用一堆函数,为什么有时需要引入逗号运算符 ( )?看到这个答案,我们可以阅读这段代码:
template<typename T>
static void bar(T t) {}
template<typename... Args>
static void foo2(Args... args) {
(bar(args), ...); // <- notice: comma here
}
int main() {
foo2(1, 2, 3, "3");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
后跟将导致以下扩展的信息:
(bar(1), bar(2), bar(3), bar("3"));
Run Code Online (Sandbox Code Playgroud)
公平,有道理,但是……为什么?为什么这样做,而不是:
template<typename... Args> …Run Code Online (Sandbox Code Playgroud) 我有一个模板函数可以用 T 类型做某事
template <class T>
void EmplaceProcessor()
{
T* pProcessor = new T();
m_vItemProcessors.emplace_back(pProcessor);
}
Run Code Online (Sandbox Code Playgroud)
如果我想实现很多类型来放置到向量中,就像:
template<class...A>
void EmplaceAllProcessor()
{
const int size = sizeof...(A);
for (int i = 0; i < size; ++i)
{
EmplaceProcessor<A[i]>(); //how to expand it?????
}
}
Run Code Online (Sandbox Code Playgroud)
我想调用 EmplaceAllProcessor<P1, P2, P3>(); 安装所有类型的处理器
我想调用 EmplaceAllProcessor<P1, P2, P3>(); 要安放各种类型的处理器,怎么可能呢?
我有一个功能模板如下.需要明确给出模板参数.
template<typename T>
void Func() {...};
Run Code Online (Sandbox Code Playgroud)
我需要为参数包中的每个类型调用此函数:
template<typename... Inputs>
struct SetStruct{
void Set() {
// Call Func() here
}
};
Run Code Online (Sandbox Code Playgroud)
有没有简单的方法来扩展参数包?我试过了:
Func<Inputs>()...;
Run Code Online (Sandbox Code Playgroud)
和
Func<Inputs>...();
Run Code Online (Sandbox Code Playgroud)
但它们都不起作用.
我只能使用C++ 11 :(
c++ templates template-meta-programming variadic-templates c++11
我想计算提供给 function 的任意数量的参数的总和sum。假设给予函数的整数将满足operator+.
如果我注释掉该函数sum()(没有参数的函数),则代码无法编译。如果我取消注释,代码会编译并运行,但永远不会命中 function sum()。
我似乎无法理解为什么我们需要有sum()功能,因为我正在使用条件sizeof...(Args)
如果有人能帮助我理解这一点,我会非常感激吗?
/*
int sum()
{
std::cout << "Sum with 0 Args" << std::endl;
return 0;
}
*/
template <typename T, typename...Args>
T sum(T first, Args...args)
{
// std::cout << sizeof...(Args) << std::endl;
if (sizeof...(Args) != 0)
{
return first + sum(args...);
}
else
{
std::cout << "Found 0 args" << std::endl;
return first;
}
}
int main()
{
std::cout << sum(1, 2, 3) …Run Code Online (Sandbox Code Playgroud)