提升:将变体与apply_visitor进行比较
Boost: Comparing variants with apply_visitor
有人可以告诉我为什么我在以下代码的最后一行中遇到编译器错误?
注意:如果我删除以下行,我的代码将不会出现错误:
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期望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;
工作正常 - 我认为这是您要完成的工作?您要测试两个变体同样可比(?),只要您的变体中的所有对象都同样可比。
关于:
但是,当我致电AppliedequalityVisitor(compareValue)时,它总是返回 虚假,无论相比值是什么。有什么想法吗?
我认为您误解了访问者的使用情况,操作员()被带有带有变体参数的实际变体类型(在您的示例中)。
编辑:在代码
中int testValue = 12;
CheckOneTypeEquality<MyVariant> equalityVisitor(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) );
相关文章:
- 比较并显示使用最小值(a,b)和最大值(a、b)升序排列的4个数字
- 为什么比较运算符如此快速
- 我可以使用 g++ 进行三种比较 (<=>) 吗?
- 比较字符数组
- 将模板化的类型与C++中的某些类/类型进行比较
- C++自定义比较函数
- 如何比较自定义类的std::变体
- 多个If语句与使用逻辑运算符计算条件的单个语句的比较
- std::设置自定义比较器
- 布尔比较运算符是如何在C++中工作的
- C++将目录中的所有文件与::filesystem进行比较
- shell排序中的交换和比较
- 如何在C++中比较两个char数组
- catch框架有没有办法比较流或文件
- 从文件中读取多个字节,并将它们存储在C++中进行比较
- 智能指针作为无序映射键,并通过引用进行比较
- 比较if语句中的数组值和int值
- 对于循环变体比较
- 使用自定义比较函数使用std::sort()对矢量字符串进行排序时出现问题
- 比较两个大小不等的映射c++