2

假设我有:

class TypeA { };
class TypeB { };
typedef boost::variant<TypeA, TypeB> Type;
  1. 还行吧:

    void foo(Type t) { };
    
    int main(){
        TypeA a;
        foo(a);
    }
    
  2. 这不会编译:

    void foo(Type &t) { };
    
    int main(){
        TypeA a;
        foo(a);
    }
    

    出现错误:

    从“TypeA”类型的表达式中对“Type&”类型的引用进行无效初始化</p>

  3. 这也不能编译:

    void foo(Type *t) { };
    
    int main(){
        TypeA a;
        foo(&a);
    }
    

    出现错误:

    无法将参数 '1' 的 'TypeA*' 转换为 'Type*' 到 'void foo(Type*)'</p>

有没有办法通过引用(如案例 2)或指针(如案例 3)将由 boost::variant 聚合的类型之一的实例传递给接受 boost::variant 的函数?

非常感谢你!

4

2 回答 2

1

聚合意味着boost::variant包含TypeATypeB。它没有。它包含TypeATypeB。它更像是一个联合而不是一个结构。

您可以按值传递TypeA,因为存在从TypeAto的隐式转换Type

没有从TypeA&to Type&(或TypeA*to Type*)的隐式转换,也不应该有。想想如果一个TypeA对象的引用被传入foo()foo()决定用一个TypeB值替换它会发生什么。

在不知道foo()TypeA/TypeB是什么的情况下,我无法给您更具体的建议,但也许您可以使用函数模板。IE

template <typename T>
void foo(T& t) {}

或重载函数:

void foo(TypeA& t) {}
void foo(TypeB& t) {}
于 2011-02-23T13:26:58.453 回答
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,然后获取指向 this 的指针/引用
  • 创建一个boost::variant<TypeA*,TypeB*>用于隐式转换的函数

第三种解决方案是更改 foo 本身,并使其成为模板。这取决于你想做什么。

于 2011-02-23T13:51:35.393 回答