假设我有:
class TypeA { };
class TypeB { };
typedef boost::variant<TypeA, TypeB> Type;
没关系:
void foo(Type t) { };
int main(){
TypeA a;
foo(a);
}
这不编译:
void foo(Type &t) { };
int main(){
TypeA a;
foo(a);
}
错误:
无效初始化“Type&amp;”类型的引用 表达类型'TypeA'
这也不能编译:
void foo(Type *t) { };
int main(){
TypeA a;
foo(&a);
}
错误:
无法将参数'1'的'TypeA *'转换为'Type *'为'void FOO(类型*)”
有没有办法传递给一个接受boost :: variant的函数的函数,该函数由boost :: variant聚合的一个类型的实例,通过引用(如情况2)或指针(如案例3)?
非常感谢!
答案 0 :(得分:1)
汇总意味着boost::variant
同时包含TypeA
和TypeB
。它没有。它包含TypeA
或TypeB
。它更像是一个联合而不是结构。
您可以按值传递TypeA
,因为存在从TypeA
到Type
的隐式转换。
没有从TypeA&
到Type&
(或TypeA*
到Type*
)的隐式转换,但不应该存在。想一想如果TypeA
对象的引用传递到foo()
并且foo()
决定将其替换为TypeB
值,会发生什么。
在不知道foo()
和TypeA
/ TypeB
是什么的情况下,我无法向您提供更具体的建议,但也许您可以使用功能模板。即。
template <typename T>
void foo(T& t) {}
或重载函数:
void foo(TypeA& t) {}
void foo(TypeB& t) {}
答案 1 :(得分:1)
1中真正发生的事情:
TypeA a;
Type __temporary__(a);
foo(__temporary__);
在2或3中不可能发生的事情:
TypeA a;
Type* __temporary__(&a);
// this fails because there is no inheritance relationship
foo(__temporary__);
你有两个解决方案(非模板foo):
Type
,然后获取指向此boost::variant<TypeA*,TypeB*>
进行隐式转换以启用第三种解决方案是改变foo本身,并使其成为模板。这取决于你想做什么。