Я путаю следующую проблему, идентифицируя определенный тип в 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) из перегруженного оператора, реализованного в классе посетителя.
Реализация шаблона посетителя заставит компилятор выполнить проверку типов за вас. Все, что вам нужно сделать, это сказать компилятору какие делать, когда 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
,
Других решений пока нет …