c++ - 当目标类有多个构造函数时消除强制转换运算符的歧义

标签 c++ overloading c++03 disambiguation

我正在尝试创建用于转换字符串的实用程序,因为我的接口(interface)混合不好,需要各种容器(char*、std::string、自定义字符串类型)和格式(utf-8、utf-16、utf)中的字符串-32)。所以我想到创建一个包装器,其中包含各种类型的强制转换运算符。像这样:

#include <iostream>
#include <string>

struct X {
    operator std::string() { return std::string("string x"); }
    operator const char *() { return "zstring x"; }
};

X make_x() { return X(); }

int main()
{
    std::string y = make_x(); // this works
    std::string y(make_x()); // but this does not
    y = make_x(); // this does not work either
    y = std::string(make_x()); // nor does this, so it's about useless
    std::cout << y << std::endl;
    return 0;
}

但问题是,如果类型同时转换为 char *std::string,则 std::string 构造函数和这两种类型之间的分配将是不明确的。我不想只遍历 char * ,因为字符串最初可能是由范围给出的,而不是以 nul 结尾的,需要额外的拷贝来获取 nul 结尾的字符串以及嵌入 nul不工作。

那么有什么办法可以消除这些歧义吗?

重要提示:我无法使用某些 C++03 编译器,因此两个强制转换运算符都无法标记为显式。

最佳答案

在将 make_x() 的结果作为函数参数传递之前,将其显式转换为 std::stringconst char* 或其他内容,e。例如:

std::string y(static_cast<const char*>(make_x()));

如果您需要经常执行此操作并认为它很冗长,请为强制转换运算符指定短名称:

struct X {
    std::string str() { return std::string("string x"); }
    const char *cstr() { return "zstring x"; }
};

std::string y(make_x().str());

如果这也 Not Acceptable ,请调整 safe bool idiom达到您的目的。

关于c++ - 当目标类有多个构造函数时消除强制转换运算符的歧义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17059786/

相关文章:

java - 除了覆盖算术运算符之外,还有其他方法可以在 Java 中实现 "overflow safe"算术运算吗?

c++ - Variadic 模板参数顺序问题

c++ - 在 C++03 中仅使用标准函数获取 std::pair 成员

c++ - 链接时找不到 C++ 库,编译 `boost::program_options` 示例时出错

c++ - C++ 应用程序中的 QML,反之亦然

c++ - operator =重载,终止符递归调用

inheritance - 如何在 TypeScript 的派生类中重载构造函数?

c++ - 测试 C++98 字符串是否为科学计数法的数字

c++ - 从 ttf 到 type 2 CID 字体(type 42 基本字体)的转换

c++ - 这些成员是否有未指定的顺序?