определить тип варианта

Я путаю следующую проблему, идентифицируя определенный тип в boost::variant и передать его как аргумент функции-члена в объекте класса. Рассмотрим следующий код

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

class test{

void func1 (Variant V);
void func2 (string s);
void func3 ();};test::func1(Variant V){
// How can I identify the type of V inside the body of this function?
Or how can I call the apply_visitor inside this function.
/*
if(v.type() == string)
func2();
else if(v.type() == double)
funct3();
*/
}
int test::func2(){ cout << "func3" << endl;}
int test::func3(){ cout << "func4" << endl;}
...

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

}

Я подумал о реализации класса / структуры посещения (apply_visitor) в рамках теста класса. Однако я застрял, вызвав внешнюю функцию-член, а именно func3 (string s) из перегруженного оператора, реализованного в классе посетителя.

1

Решение

Реализация шаблона посетителя заставит компилятор выполнить проверку типов за вас. Все, что вам нужно сделать, это сказать компилятору какие делать, когда string находится в Variant:

(посмотрите пример на
http://www.boost.org/doc/libs/1_35_0/doc/html/variant/tutorial.html)

struct my_dispatcher : public boost::static_visitor<> {

test* t;
my_dispatcher(test* t): t(t) {}

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

и использовать boost::apply_visitor выбрать правильную функцию:

int main ()
{
test t;
my_dispatcher dispatcher(&t);

Variant V = 3;
boost::apply_visitor( dispatcher, v );

V = "hello";
boost::apply_visitor( dispatcher, v );
}

my_dispatcher(&t) создаст объект вашей реализации static_visitor, который будет использоваться apply_visitor магия.

Надеюсь, это то, что вы искали, потому что ваш вопрос был не совсем ясен.

Примечание: в качестве альтернативы, вы получаете свой test от static_visitor,

3

Другие решения

Других решений пока нет …