有人可以告诉我为什么我在下面代码的最后一行收到编译错误了吗?
note :如果删除以下行,我的代码将被编译而没有错误:
appliedEqualityVisitor(compareValue);
以下是代码:
#include "boost/variant/variant.hpp"
#include "boost/variant/apply_visitor.hpp"
using namespace std;
using namespace boost;
template<typename T>
struct CheckOneTypeEquality : public boost::static_visitor<>
{
T const* value;
bool operator()( T const& other ) const
{
return other == *value;
}
template<typename U>
bool operator()( U const& other ) const
{
return false;
}
CheckOneTypeEquality( T const& value_ ):value(&value_) {}
};
typedef variant<int, string> MyVariant;
typedef apply_visitor_delayed_t<CheckOneTypeEquality<MyVariant>> AppliedEqualityVisitorType;
int main(int argc, char **argv)
{
int testValue = 12;
CheckOneTypeEquality<MyVariant> equalityVisitor(testValue);
AppliedEqualityVisitorType appliedEqualityVisitor = apply_visitor(equalityVisitor);
MyVariant compareValue = 13;
appliedEqualityVisitor(compareValue); // <<<<< compile error here
return 0;
}
答案 0 :(得分:1)
问题源于您的访客班级。 Boost需要void operator()(...)
,而是提供返回内容的operator()
。
要使您的模式有效,您必须更改访问者,例如:
template<typename T>
struct CheckOneTypeEquality : public boost::static_visitor<>
{
T const* value;
mutable bool check;
void operator()( T const& other ) const
{
check = other == *value;
}
template<typename U>
void operator()( U const& other ) const
{
check = false;
}
CheckOneTypeEquality( T const& value_ ):value(&value_), check(false) {}
};
然后测试结果。顺便说一句。我不确定您传递int
的构造函数是否安全。你没有持有引用,而是指向到由int构造的变体的临时实例 - 这可能超出了范围。
编辑:鉴于boost::variant
已正确实施operator==
,我认为您尝试做的事情是错误的。例如:
MyVariant testValue = 12;
MyVariant compareValue = 13;
MyVariant compareValue2 = 12;
MyVariant compareValue3 = "12";
std::cout << (compareValue == testValue) << std::endl;
std::cout << (compareValue2 == testValue) << std::endl;
std::cout << (compareValue3 == testValue) << std::endl;
工作正常 - 我认为这是你想要完成的事情?您想测试两个变体具有相同的可比性(?)只要变体中的所有对象具有相同的可比性,这将起作用。
答案 1 :(得分:0)
关于:
但是当我调用applyEqualityVisitor(compareValue)时,它总是返回 false,无论compareValue是什么。有什么想法吗?
我认为您误解了访问者的使用情况,使用实际的变体类型调用operator(),而不是使用变量参数(在您的示例中为int)。
编辑: 在代码中
int testValue = 12;
CheckOneTypeEquality<MyVariant> equalityVisitor(testValue);
在实例化访问者时,testValue将转换为MyVariant。
的提升示例class are_strict_equals
: public boost::static_visitor<bool>
{
public:
template <typename T, typename U>
bool operator()( const T &, const U & ) const
{
return false; // cannot compare different types
}
template <typename T>
bool operator()( const T & lhs, const T & rhs ) const
{
return lhs == rhs;
}
};
boost::variant< int, std::string > v1( "hello" );
boost::variant< double, std::string > v2( "hello" );
assert( boost::apply_visitor(are_strict_equals(), v1, v2) );
boost::variant< int, const char * > v3( "hello" );
assert( !boost::apply_visitor(are_strict_equals(), v1, v3) );
在