标签:c boost-variant
我正在使用boost :: variant< int,std :: string,bool>当我遇到意外行为时,它及其访问者:字符串和布尔值是可比较的.我不知道为什么它会这样工作,但是我发现它很有趣.我唯一的想法是将具有bool值的变体解释为char?有人可以向我解释吗?
比较访客:
#include <iostream>
#include <algorithm>
#include <vector>
#include <boost/variant.hpp>
#include <boost/function.hpp>
struct my_less : boost::static_visitor<bool*>
{
template<typename T>
bool* operator()(T a, T b) const
{
return a<b ? new bool(true) : new bool(false);
}
template<typename T, typename U>
bool* operator()(T a, U b) const
{
return NULL;
}
};
int main()
{
typedef boost::variant<int,bool,std::string> datatype;
datatype *a = new datatype(false);
datatype *b = new datatype("abc");
my_less cmp;
bool* val = boost::apply_visitor(cmp,*a,*b);
if(val)
{
std::cout << *val;
}
else
{
std::cout << "NULL";
}
}
编辑
这是带有一些测试用例的扩展主功能:
void show_result(bool* val)
{
if(val)
{
std::cout << *val << std::endl;
}
else
{
std::cout << "NULL" << std::endl;
}
}
int main()
{
//std::string a = "bbb";
//bool b = true;
//std::cout << b<a; //compilation error
typedef boost::variant<int,bool,std::string> datatype;
datatype int_value_1(4);
datatype int_value_2(3);
datatype string_value("abc");
datatype bool_value(true);
my_less cmp;
std::cout<<"First result, compare ints 4 and 3:"<<std::endl;
bool* val = boost::apply_visitor(cmp,int_value_1,int_value_2);
show_result(val);
std::cout<<"Second result, compare int to string 4 to abc " << std::endl;
val = boost::apply_visitor(cmp,int_value_1,string_value);
show_result(val);
std::cout <<"Third result, int 4 to bool true:" << std::endl;
val = boost::apply_visitor(cmp,int_value_1,bool_value);
show_result(val);
std::cout<<"Fourth result, string abc to bool true" << std::endl;
val = boost::apply_visitor(cmp,string_value,bool_value);
show_result(val);
}
输出:
First result, compare ints 4 and 3:
0
Second result, compare int to string 4 to abc
NULL
Third result, int 4 to bool true:
NULL
Fourth result, string abc to bool true
0
解决方法:
好的,既然您已经完全更改了程序,让我再试一次.
问题是:
datatype *b = new datatype("abc");
“ abc”是const char *,而不是std :: string.如果要创建std :: string变体,则需要明确地这样做.否则,您将最终创建bool变体,因为所有指针(包括const char *指针)都可以转换为bool.
尝试这个
datatype *b = new datatype(std::string("abc"));
bool和std :: string之间的这种相互作用显然是众所周知的,并且有些令人讨厌. boost :: variant提供了模板化的构造函数,但是解析规则更喜欢内置对话而不是bool,并且C语言中无法在构造函数上指定模板特化.可以显式地专门化分配,因此您可以编写:
datatype b;
b.operator=<std::string>("abc");
这可能会比在某种程度上更有效,但可读性比
datatype b;
b = std::string("abc");
如果您不包含bool作为变体,则字符串文字会自动转换为std :: string.也许可以使用某种代理伪布尔类.我从来没有试过.
标签:c,boost-variant 来源: https://codeday.me/bug/20191012/1897460.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。