#include<tuple>
#include<iostream>
using namespace std;
class A
{
public:
int v;
A(int a) : v(a){}
operator int (){return v;}
};
class B
{
public:
int v;
B(int a) : v(a + 1) {}
operator int (){return v;}
};
class C
{
public:
int v;
C(int a) : v(a + 2){}
operator int (){return v;}
};
template <typename... Args >
int f(int a, Args... args )
{
tuple<Args...> argstuple1( std::forward<Args>(a)... );
tuple<Args...> argstuple2(Args{a}...);
//The following initialization won't compile
tuple<Args...> argstuple2(Args(a)...);
cout << (int)std::get<2>(argstuple2) << endl;
return 1;
}
int main()
{
f< A, B, C>(5,0,0,0);
}
我在这里尝试做的是,给定一个值,我有 3 个不同的类以 3 种不同的方式处理同一个值。我在这里得到的问题是如何扩展参数包并使用给定的单个值 a 初始化每个类。
tuple<Args...> argstuple2(Args(a)...);
我认为上面的代码会扩展成
tuple<A, B, C> argstuple2(A(a), B(a), C(a));
看起来编译器不喜欢这样。 但是,以下所有代码都可以正常编译
tuple<Args...> argstuple2(Args(1)...);
tuple<Args...> argstuple2(Args{a}...);
tuple<Args...> argstuple2(std::forward<Args>(a)...);
我想知道为什么 Args(a)... 无法展开? Args(a)... 和 Args{a}... 有什么区别? std::forward(a)...) 怎么样?
我正在使用 gnu 4.7.1
最佳答案
// now it will
using tuple_args = tuple< Args... >;
tuple_args argstuple3((Args(a))...);
关于c++ - 为什么不扩展可变参数模板参数包?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44053274/