0

関連するメンバー関数を実行するために、クラスオブジェクト内のboost::variantのタイプを識別しようとしています。次のコードを検討してください。

#include <cstdio>
#include <cassert>
#include <iostream>
#include <boost/variant.hpp>
#include <string>
using namespace std;

typedef boost::variant< string, double> Variant;

class test{ 
  public:
    void func1 (Variant V); 
    void func2 (string s); 
    void func3 (double d);
    struct my_visitor : public boost::static_visitor<> {
      test &my_test;
      my_visitor(test &arg) : my_test(arg) {}

      void operator()( string s ) { my_test.func2(s); }
      void operator()( double d ) { my_test.func3(d); }
      //... for each supported type
    };

}; 


void test::func1(Variant V){
  boost::apply_visitor( my_visitor(*this),V);
}

void test::func2( string s){ cout << "func3" << endl;}
void test::func3(double d){ cout << "func4" << endl;}

int main (){
    test t;
    Variant V = 3.1;
    t.func1(V); 
    V = "hello"; 
    t.func1(V);
}

問題は、同じオブジェクト内のそのデータ型EVENに関連するメンバー関数を呼び出すために、メンバー関数内のバリアントのタイプを識別する必要があることです。

4

1 に答える 1

3

質問は明確ではありませんが、おそらくこれを探していますか?

class test {
  //...

struct my_visitor : public boost::static_visitor<> {
  test &my_test;
  my_visitor(test &arg) : my_test(arg) {}

  void operator()( string s ) const { my_test.func3(s); }
  void operator()( double d ) const { my_test.func4(d); }
  //... for each supported type
};

  //...
};


test::func1(Variant V) {
  boost::apply_visitor(my_visitor(*this), V);
}

EDITconstに修飾子を追加して、 inoperator()の一時的な使用を許可しました。my_visitorapply_visitor()

于 2012-11-28T10:02:32.240 に答える