C++ 字符串布尔比较-为什么?
我在使用C++ 字符串布尔比较-为什么?,c++,boost-variant,C++,Boost Variant,我在使用boost::variant及其访问者时遇到了一个意外的行为:字符串和bool值是可比较的。我不知道,为什么会这样,但我觉得很有趣。我唯一的想法是带有bool值的变量被解释为char?有人能给我解释一下吗? 比较访问者: #include <iostream> #include <algorithm> #include <vector> #include <boost/variant.hpp> #include <boost/func
boost::variant
及其访问者时遇到了一个意外的行为:字符串和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";
}
}
好的,现在您已经完全更改了程序,让我再试一次 问题是:
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
之间的这种相互作用显然是众所周知的,而且有点令人恼火<代码> Boo::变体 BOOL ,C++中没有办法在构造函数上指定模板特化。可以显式专门化赋值,因此您可以编写:
datatype b;
b.operator=<std::string>("abc");
如果您没有将
bool
作为变量,那么字符串文本会自动转换为std::string
。也许可以使用某种代理伪布尔类。我从未尝试过。好的,现在您已经完全更改了程序,让我再试一次
问题是:
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
之间的这种相互作用显然是众所周知的,而且有点令人恼火<代码> Boo::变体 BOOL ,C++中没有办法在构造函数上指定模板特化。可以显式专门化赋值,因此您可以编写:
datatype b;
b.operator=<std::string>("abc");
如果您没有将
bool
作为变量,那么字符串文本会自动转换为std::string
。也许可以使用某种代理伪布尔类。我从来没有试过。请试一下。i、 e.显示main
如何定义TRUE
和FALSE
结构之前。。。我上传了最终的测试用例,一个完整的程序。任何指针都可以转换到bool
。请上传测试用例。i、 e.显示main
如何定义TRUE
和FALSE
结构之前。。。我上传了最终的测试用例,一个完整的程序。任何指针都可以转换到bool
。很抱歉,更改该程序是一个更大项目的一部分,所以我在这里复制它时遇到了一些失败。+1表示“现在你已经完全更改了你的程序”,表示发布了新的答案,表示正确。很抱歉,更改了该程序,这是一个更大项目的一部分,所以我在这里复制它时失败了。+1表示“现在你已经完全改变了你的程序”,表示发布了新的答案,表示正确。