字符串布尔比较 - 为啥?
Posted
技术标签:
【中文标题】字符串布尔比较 - 为啥?【英文标题】:String-bool comparsion - why?字符串布尔比较 - 为什么? 【发布时间】:2013-01-17 03:25:43 【问题描述】:当我遇到意外行为时,我正在与boost::variant<int,std::string,bool>
及其访问者一起工作:字符串和布尔值是可比较的。我不知道,为什么它会这样工作,但我发现它很有趣。我唯一的想法是带有布尔值的变体被解释为字符?有人可以给我解释一下吗?
比较访问者:
#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
【问题讨论】:
请测试用例。即显示main
TRUE
和 FALSE
是如何定义的?
在结构之前...我上传了最终的测试用例,一个完整的程序。
任何指针都可以转换为bool
。
【参考方案1】:
好的,既然你已经完全改变了你的程序,让我再试一次。
问题是:
datatype *b = new datatype("abc");
"abc"
是 const char*
,而不是 std::string
。如果你想创建一个std::string
变体,你需要明确地这样做。否则,您最终将创建一个 bool
变体,因为所有指针都可以转换为 bool
,包括 const char*
指针。
试试这个
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
。也许可以使用某种代理伪布尔类。没试过。
【讨论】:
抱歉改了程序,这是一个更大的项目的一部分,所以我在这里复制的时候有些失败。 +1 表示“现在你已经完全改变了你的程序”,发布了一个新的答案,并且是正确的。以上是关于字符串布尔比较 - 为啥?的主要内容,如果未能解决你的问题,请参考以下文章
为啥 ~(true^true) 不正确?布尔运算符(否定)适用于“无符号字符”,但不适用于布尔值? (C++)
为啥 Boolean.prototype 又是一个布尔对象? (对于字符串和数字也是如此,但不是日期或正则表达式?)
Rails 4 的 best_in_place gem 复选框问题(为啥字符串没有转换为布尔值?)