字符串bool比较-为什么
String-bool comparsion - why?
我正在处理boost::variant<int,std::string,bool>
和它的访问者,这时我遇到了一个意想不到的行为:字符串和bool值是可比较的。我不知道为什么会这样,但我觉得很有趣。我唯一的想法是,与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";
}
}
编辑下面是一个扩展的main函数和一些测试用例:
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
变体,因为所有指针都可转换为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
。也许可以使用某种代理伪布尔类。我从来没试过。
相关文章:
- 为什么比较运算符如此快速
- 为什么:不同符号的整数比较只是偶尔发生?
- 为什么字符串比较的 == 运算符相对于任一字符串长度线性时间(似乎)?
- 为什么组合的上限和下限比较的计算结果总是为 true?
- 为什么 Boost multi_index只修改第一个索引的键时对第二个索引进行比较?
- 为什么我的比较运算符不比较我的点长和双精度值?
- 为什么 std::stable_sort() 的比较函数的参数必须是设置常量?
- 为什么'Hello'与CPP中的'World'进行比较时被打印出来?
- 为什么在类或结构中传递自定义比较器函数?
- 浮点数比较为什么没有相等的函数
- 为什么 std::variant 找不到运算符<() 当与比较类不在同一命名空间中时
- 为什么sub_match和basic_string比较运算符使用额外的字符串副本实现?
- 为什么比较函数类型需要指定为模板参数?
- 为什么比较和交换操作同时存在免费函数和成员函数?
- 为什么比较运算符"=="返回"YES"即使两个向量不同?
- 为什么比较两次 char 变量比比较一次短变量更快
- 为什么比较两个字符串的结果遗漏了最后匹配的字符串
- 为什么比较方法不起作用?
- 为什么比较 constexpr 函数的两个参数不是静态断言的常量条件
- 为什么比较成员函数指针为NULL会产生警告?