字符串-布尔比较 - 为什么?

2023-12-11

我正在与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" is a const char*, not a std::string。如果你想创建一个std::string变体,您需要明确地这样做。否则,你最终会创建一个bool变体,因为所有指针都可以转换为bool, 包括const char*指针。

Try this

datatype *b = new datatype(std::string("abc"));

之间的这种相互作用bool and std::string显然是众所周知的并且有点令人恼火。boost::variant提供模板化构造函数,但解析规则更喜欢内置转换boolC++ 中无法在构造函数上指定模板专门化。可以显式地专门化赋值,因此您可以编写:

datatype b;
b.operator=<std::string>("abc");

这可能会稍微高效一些,但可读性却比

datatype b;
b = std::string("abc");

如果你不包括bool作为变体,那么字符串文字会自动转换为std::string。也许可以使用某种代理伪布尔类。我从来没有试过。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

字符串-布尔比较 - 为什么? 的相关文章

随机推荐