2
  struct A
  {
    std::string get_string();
  }; 

  struct B
  {
    int value;
  }; 

  typedef boost::variant<A,B> var_types;
  std::vector<var_types> v;

  A a;
  B b;

  v.push_back(a);
  v.push_back(b);

v の要素を繰り返し処理して a および b オブジェクトにアクセスするにはどうすればよいですか?

私はboost::getでそれを行うことができますが、構文は本当に面倒です.:

std::vector<var_types>:: it = v.begin();
while(it != v.end())
{
    if(A* temp_object = boost::get<A>(&(*it)))    
      std::cout << temp_object->get_string();
    ++it;
}

訪問テクニックを使用しようとしましたが、あまりうまくいかず、コードが機能していません:

template<typename Type>
class get_object
  : public boost::static_visitor<Type>
{
public:

  Type operator()(Type & i) const
  {
    return i;
  }

};

...

while(it != v.end())
{
    A temp_object = boost::apply_visitor(get_object<A>(),*it);
    ++it;
}

編集1

ハックな解決策は次のとおりです。

class get_object
  : public boost::static_visitor<A>
{
public:

  A operator()(const A & i) const
  {
    return i;
  }

  A operator()(const B& i) const
  {
    return A();
  }        
};
4

2 に答える 2

3

私が見る限り、訪問者が仕事をすることになっています。保存された値を取得したいだけの場合、boost::get私が間違っていなければそのための事前に作成されたビジターです。

例:

  struct print_if_a : boost::static_visitor<void>
  {
    void operator()(A& a) const { std::cout << a.get_string() << '\n'; } //alas, get_string is non-const 
    void operator()(const B&) const {} //does nothing, up to optimizer
  };

使用法:

  BOOST_FOREACH(var_types& obj, v) {
    boost::apply_visitor(print_if_a(), obj);
  }
于 2010-06-20T09:41:53.957 に答える
1

編集:
UncleBens が示唆している場合は、次のように簡単に実行できます。

BOOST_FOREACH(var_types& vt, v) {
    if (vt.which() == 0)  
        cout << get<A>(vt).get_string() << endl;
}

オリジナル:
のテンプレート パラメータstatic_vistorは、そのメソッドの戻り値の型です。これは、2 つのクラスが 1 人の訪問者に対して共通の戻り値の型を共有する必要があることを意味します。次のようになります。

class ABVisitor : public static_visitor<string> {
public:
    string operator()(const A& a) const {
        return a.get_string();
    }
    string operator()(const B& b) const {
        return lexical_cast<string>(b.value);
    }
};

このビジターを使用した反復の例を次に示します。

BOOST_FOREACH(var_types& vt, v)
    cout << apply_visitor(ABVisitor(), vt) << endl;
于 2010-06-20T09:38:48.787 に答える