我通过识别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)而陷入困境。
答案 0 :(得分:3)
访问者模式的确定将使编译器为您进行类型检查。您需要做的就是在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