将boost :: variant聚合的类型的对象传递给接受boost :: variant的函数

假设我有:
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);
}
有错误:   不能将'TypeA *'转换为'Type *'以将参数'1'转换为'void   FOO(类型*)” 有没有办法传递给一个接受boost :: variant的函数的函数,该函数由boost :: variant聚合的一个类型的实例,通过引用(如情况2)或指针(如情况3) ? 非常感谢你!     
已邀请:
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本身,并使其成为模板。这取决于你想做什么。     
聚合意味着
boost::variant
包含
TypeA
TypeB
。它没有。它包含
TypeA
TypeB
。它更像是一个联合而不是一个结构。 您可以按值传递
TypeA
,因为存在从
TypeA
到ѭ6implicit的隐式转换。 从
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) {}
    

要回复问题请先登录注册