我正在尝试boost-variant自定义课程。我知道访问类内容的安全方法是使用boost::static_visitor. 你知道为什么下面的代码不能编译吗?对签名/声明有什么要求吗?boost::static_visitor使用时
我发现这个问题Why can't I access this custom type with boost::variant? 但我没明白。
问候
AFG
#include <iostream>
#include <algorithm>
#include <boost/variant.hpp>
struct CA{};
struct ca_visitor : public boost::static_visitor<CA>
{
const CA& operator()(const CA& obj ) const { return obj;}
};
struct CB{};
struct cb_visitor : public boost::static_visitor<CB>
{
const CB& operator()(const CB& obj) const { return obj;}
};
int main(){
typedef boost::variant<
CA
,CB > v_type;
v_type v;
const CA& a = boost::apply_visitor( ca_visitor(), v );
}
Run Code Online (Sandbox Code Playgroud)
首先, 的模板参数boost::static_visitor<>应该指定调用运算符返回的类型。在您的情况下,ca_visitor的调用运算符返回 a CA const&,而不是 a CA。
但这还不是最大的问题。最大的问题是您似乎对如何工作variant<>以及static_visitor<>应该如何工作有误解。
a 的想法boost::variant<>是它可以保存您在模板参数列表中指定的任何类型的值。您不知道该类型是什么,因此您为访问者提供了几个重载的调用运算符来处理每种可能的情况。
因此,当您提供访问者时,您需要确保它operator()具有接受您可以持有的类型的所有必要重载variant。如果您不这样做,Boost.Variant 会导致生成编译错误(这对您有好处,因为您忘记处理某些情况)。
这就是您面临的问题:您的访问者没有接受类型对象的调用运算符CB。
boost::variant<>这是正确使用and的示例static_visitor<>:
#include <iostream>
#include <algorithm>
#include <boost/variant.hpp>
struct A{};
struct B{};
struct my_visitor : public boost::static_visitor<bool>
// ^^^^
// This must be the same as the
// return type of your call
// operators
{
bool operator() (const A& obj ) const { return true; }
bool operator() (const B& obj) const { return false; }
};
int main()
{
A a;
B b;
my_visitor mv;
typedef boost::variant<A, B> v_type;
v_type v = a;
bool res = v.apply_visitor(mv);
std::cout << res; // Should print 1
v = b;
res = v.apply_visitor(mv);
std::cout << res; // Should print 0
}
Run Code Online (Sandbox Code Playgroud)