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' を 'void foo(Type*)' にするために 'TypeA*' を 'Type*' に変換できません</p>

boost::variant を受け入れる関数に、参照 (ケース 2 のように) またはポインタ (ケース 3 のように) のいずれかを介して、その boost::variant によって集約された型の 1 つのインスタンスを渡す方法はありますか? ?

どうもありがとうございました!

4

2 に答える 2

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__);

2つの解決策があります(テンプレート以外のfooの場合):

  • に変換してからType、これへのポインタ/参照を取得します
  • boost::variant<TypeA*,TypeB*>暗黙の変換を作成して開始します

3番目の解決策は、foo自体を変更し、それをテンプレートにすることです。それはあなたが何をしたいかによります。

于 2011-02-23T13:51:35.393 に答える
1

集約は、にとのboost::variant両方が含まれていることを意味します。そうではありません。またはのいずれかが含まれます。構造体というよりはユニオンに似ています。TypeATypeBTypeATypeB

からへTypeAの暗黙的な変換があるため、値で渡すことができます。TypeAType

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) {}
于 2011-02-23T13:26:58.453 に答える