假设我有:路过一个boost ::变种的功能聚合的类型的对象,接受的boost ::变种
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); }
与错误:
invalid initialization of reference of type ‘Type&’ from expression of type ‘TypeA’
而且这并不编译:
void foo(Type *t) { }; int main(){ TypeA a; foo(&a); }
与错误:
cannot convert ‘TypeA*’ to ‘Type*’ for argument ‘1’ to ‘void foo(Type*)’
有没有办法传递给接受升压功能:: variant是通过引用(如情况2)或指针(如情况3)由该boost :: variant聚合的其中一种类型的实例?
非常感谢!
谢谢!但是,__temporary__'是什么意思?如果你的意思是一个编译器的临时对象,是不是只能通过调用eg来创建它。 “富(类型A());” ?在你的第一个解决方案中,从TypeA到Type的转换是否需要拷贝,例如。如“TypeA a; Type t = a; foo(&t);”?很好你的第二个解决方案,我会考虑一下!关于模板,我怎样才能适应TypeA和TypeB,它们与无共同基类无关? – 2011-02-23 14:38:34
@ Francesco:编译器将'a'复制到'Type'类型的临时对象(变体)中,然后使用这个临时对象执行对'foo'的调用。//模板只用于不相关的类型,只要需要的方法都存在于两者中。 – 2011-02-23 15:30:00