为什么将参数包传递给具有一个模板参数的函数会多次调用它?
Why does passing a parameter pack to a function with one template parameter call it multiple times?
取此代码:
template<typename T>
int foo()
{
std::cout << "foo called" << std::endl;
return 10;
};
template<typename... Ts>
std::vector<int> bar(Ts... ts)
{
std::vector<int> vec{foo<Ts>()...};
return vec;
};
int main()
{
std::vector<int> vec = bar(1,2,3,4);
}
上面的代码输出:
foo called
foo called
foo called
foo called
这怎么可能?我以为我已经理解了模板参数包,但是 std::vector<int> vec{foo<Ts>()...};
行如何导致 foo
被多次调用? foo
是否返回参数包,因为我们在函数调用中使用了 ...
运算符?
这段代码是怎么回事?
foo<T>()...
扩展为 foo<T1>(), foo<T2>(), foo<T2>(), ...
。在你的例子中,由于你的向量有四个分量,你的函数将被调用四次。
取此代码:
template<typename T>
int foo()
{
std::cout << "foo called" << std::endl;
return 10;
};
template<typename... Ts>
std::vector<int> bar(Ts... ts)
{
std::vector<int> vec{foo<Ts>()...};
return vec;
};
int main()
{
std::vector<int> vec = bar(1,2,3,4);
}
上面的代码输出:
foo called
foo called
foo called
foo called
这怎么可能?我以为我已经理解了模板参数包,但是 std::vector<int> vec{foo<Ts>()...};
行如何导致 foo
被多次调用? foo
是否返回参数包,因为我们在函数调用中使用了 ...
运算符?
这段代码是怎么回事?
foo<T>()...
扩展为 foo<T1>(), foo<T2>(), foo<T2>(), ...
。在你的例子中,由于你的向量有四个分量,你的函数将被调用四次。