我有一个像这样定义的变量
auto drum = std::make_tuple
( std::make_tuple
( 0.3f
, ExampleClass
, [](ExampleClass& instance) {return instance.eGetter ();}
)
);
Run Code Online (Sandbox Code Playgroud)
我希望drum成为元组的元组.(即((a, b, c))).
我有另一个像这样定义的变量
auto base = std::make_tuple
( 0.48f
, ExampleClass
, [](ExampleClass& instance) {return instance.eGetter ();}
);
Run Code Online (Sandbox Code Playgroud)
我希望它只是三元素的元组(即(a, b, c))
我还有一个定义如下的向量
std::vector<std::tuple<std::tuple< float
, ExampleClass
, std::function<float (ExampleClass&)>
>>> listOfInstruments;
Run Code Online (Sandbox Code Playgroud)
现在,如果我添加drum,listOfInstruments我希望没有错误.
事实确实如此 listOfInstruments.push_back(drum);
我预计错误在这里,listOfInstuments.push_back(base);但代码编译得很好.
由于listOfInstruments有'元组元组',不应该只添加'元组'导致一些错误?除非双方()并(())通过被认为是同一类型std::vector.或者我完全错了,还有其他工作在这里吗?
似乎无法弄明白.
Que*_*tin 32
元组和向量大多是红鲱鱼.有效的方式就是push_back像任何函数一样,可以对其参数执行隐式转换,如以下工作代码段所示:
#include <vector>
struct A { };
struct B {
B(A const &) { }
};
int main() {
std::vector<B> v;
v.push_back(A{});
}
Run Code Online (Sandbox Code Playgroud)
回到元组,我们可以看到它(除其他外)有条件显式的构造函数(这里是#2),它引用了元组的成员:
tuple( const Types&... args );
Run Code Online (Sandbox Code Playgroud)
当且仅当所有成员都具有隐式复制构造函数时,此构造函数是隐式的,这是这里的情况(因为合成的构造函数确实是隐式的).这意味着std::tuple<...>可以隐式转换为std::tuple<std::tuple<...>>您正在观察的内容.