C++:避免​​在重载中将字符串自动转换为 bool 值

标签 c++ overload-resolution

我想创建一组方法,这些方法将根据其类型输出具有特殊格式的值。当我这样做时,到目前为止它看起来非常好:

static void printValue(std::ostringstream& out, int value) {
    out << value;
}

static void printValue(std::ostringstream& out, double value) {
    out << value;
}

static void printValue(std::ostringstream& out, const std::string& value) {
    out << "\"" << escapeString(value) << "\"";
}

测试:

printValue(std::cout, 123);    // => 123
printValue(std::cout, 3.14);   // => 3.14
printValue(std::cout, "foo");  // => "foo"

但是,只要我添加 bool 重载:

static void printValue(std::ostringstream& out, bool value) {
    out << (value ? "true" : "false");
}

...事情坏了,因为添加字符串调用似乎默认使用基于bool的重载:

printValue(std::cout, 123);    // => 123
printValue(std::cout, 3.14);   // => 3.14
printValue(std::cout, true);   // => true
printValue(std::cout, "foo");  // => true <= !!!

有什么方法可以避免这种自动强制转换为 bool 值并强制编译器为字符串选择正确的方法吗?

最佳答案

您可以添加一个模板重载,它引用大小为 Nchar 数组,其中 N 是模板参数,和/或接受 const char* 的。

template <std::size_t N>
static void printValue(sts::ostringstream& out, const char (&str)[N])
{
    out << str;
}

关于C++:避免​​在重载中将字符串自动转换为 bool 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53709105/

相关文章:

c++ - 两个候选函数模板。使一个参数成为引用后,选择不太专业的模板

c# - 希望 : Hiding a Deprecated Method with Another Overload Using Default Parameters

C++ MessageBox 字符数组

具有函数调用的 C++ 三元运算符

c++ - 对VS2010文本编辑器的好奇

c++ - 为什么返回类型在函数名之前?

c++ - 不同类型和不同编译器的 std::isinf 的不同结果

c++ - 使用哪个 : move assignment operator vs copy assignment operator

c++ - 派生类的重载解析失败

c++ - Maya 插件控制台输出不写入