0

有人可以告诉我为什么下面代码的最后一行出现编译器错误吗?

注意:如果我删除以下行,我的代码将被编译且没有错误:

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;
}
4

2 回答 2

1

问题源于您的访问者类。Boost 期望 a void operator()(...),而不是您提供 aoperator()来返回一些东西。

为了使您的模式起作用,您必须更改访问者,例如:

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;

工作正常 - 我认为这是你想要完成的?您想测试两个变体是否具有同等可比性(?)只要您的变体中的所有对象都具有同等可比性,这将起作用。

于 2012-11-06T13:52:10.783 回答
0

关于:

但是当我调用 applyEqualityVisitor(compareValue) 时,无论 compareValue 是什么,它总是返回 false。任何的想法?

我认为您误解了访问者的用法,运算符 () 是使用实际变体类型而不是变体参数(在您的示例中为 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) );

于 2012-11-06T15:16:42.963 回答