2

我正在尝试制作用于转换字符串的实用程序,因为我在各种容器(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 *and std::string,那么std::string这两种类型之间的构造函数和赋值将是模棱两可的。而且我不想通过 just char *,因为字符串可能最初是由范围给出的,而不是作为 nul 终止的,需要额外的副本来获得一个以 nul 终止的以及使嵌入的 nuls 不起作用。

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

重要提示:我被一些 C++03 编译器困住,所以这两个转换运算符都不能被标记为显式。

4

2 回答 2

1

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

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());

如果这也是不可接受的,请根据您的目的调整安全布尔成语。

于 2013-06-12T08:21:21.603 回答
1

我最终创建了一个带有强制转换运算符的助手到任何字符(charwchar_t或者取决于是 32 位uint16_t还是16 位)指针类型和另一个带有强制转换运算符的助手到任何基本字符串(专门针对上述任何一个,使用非-标准类型)。这在任何地方似乎都不是模棱两可的。uint32_twchar_t

于 2013-06-12T09:58:56.020 回答