Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/148.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Boost:将变体与apply_访问者进行比较_C++_Boost_Apply Visitor - Fatal编程技术网

C++ Boost:将变体与apply_访问者进行比较

C++ Boost:将变体与apply_访问者进行比较,c++,boost,apply-visitor,C++,Boost,Apply Visitor,有人能告诉我为什么下面代码的最后一行出现编译器错误吗 注意:如果删除以下行,则编译代码时不会出错: appliedEqualityVisitor(compareValue); 代码如下: #include "boost/variant/variant.hpp" #include "boost/variant/apply_visitor.hpp" using namespace std; using namespace boost; template<typename T> s

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

注意:如果删除以下行,则编译代码时不会出错:

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;
}
#包括“boost/variant/variant.hpp”
#包括“boost/variant/apply_visitor.hpp”
使用名称空间std;
使用名称空间boost;
模板
结构CheckOneTypeEquality:public boost::static\u visitor
{
T常数*值;
布尔运算符()(T常量和其他)常量
{
返回其他==*值;
}
模板
布尔运算符()(U常量和其他)常量
{
返回false;
}
CheckOneTypeEquality(T const&value):value(&value){}
};
typedef变异体MyVariant;
typedef apply\u visitor\u delayed\t AppliedEqualityVisitorType;
int main(int argc,字符**argv)
{
int testValue=12;
CheckOneTypeEqualityEqualityVisitor(testValue);
appliedEqualityVisitor类型appliedEqualityVisitor=apply\u visitor(equalityVisitor);
MyVariant compareValue=13;

appliedEqualityVisitor(compareValue);//问题源于您的visitor类。Boost需要一个
void操作符()(…)
,而您提供的是一个
操作符()
,它返回一些内容

要使模式正常工作,您必须更改访问者,例如:

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) {}
};
工作正常-我认为这就是您试图实现的目标?您想测试两个变体是否具有同等可比性(?)只要变体中的所有对象具有同等可比性,这将起作用。

关于:

但是当我调用appliedEqualityVisitor(compareValue)时,它总是返回 错,不管比较值是多少,知道吗

我认为您误解了访问者的用法,运算符()是使用实际的变量类型调用的,而不是使用变量参数(在您的示例中为int)

编辑: 在代码中

int testValue = 12;
CheckOneTypeEquality<MyVariant> equalityVisitor(testValue);
int testValue=12;
CheckOneTypeEqualityEqualityVisitor(testValue);
实例化访问者时,testValue将转换为MyVariant

平等的典范

类严格等于
:public boost::static\u访问者
{
公众:
模板
布尔运算符()(常数T&,常数U&)常数
{
返回false;//无法比较不同的类型
}
模板
布尔运算符()(常数T&lhs、常数T&rhs)常数
{
返回lhs==rhs;
}
};
boost::variantv1(“你好”);
boost::variantv2(“你好”);
断言(boost::apply_visitor(are_strict_equals(),v1,v2));
boost::variantv3(“你好”);
断言(!boost::apply_visitor(是严格的_equals(),v1,v3));

你是对的。我也可以通过将
boost::static\u visitor
更改为
boost::static\u visitor
来消除错误。这样我仍然可以调用bool返回值。但是当我调用
appliedEqualityVisitor(compareValue)时
无论比较值是什么,它总是返回false。有什么想法吗?谢谢你的更新。这个问题确实是我描述的一个更大问题的一部分。请看一看。虽然问题已经结束,但如果你能在评论中告诉我你的想法,我真的很感激。这与w不同OP试图实现的目标(我相信),问题似乎在于如何比较同一变体的两个实例……在代码示例中,比较v1和v2实例,但它们必须是相同类型的(例如int和long将始终返回false).@Meysam boost::variant提供了
运算符==
,因此可以使用
运算符==
比较相同变量的两个实例,前提是所有有界类型都满足相等可比较性concept@mark你说得对,我有点误入歧途!
int testValue = 12;
CheckOneTypeEquality<MyVariant> equalityVisitor(testValue);
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) );