gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:50:17 24 4
gpt4 key购买 nike

我正在尝试制作用于转换字符串的实用程序,因为我在各种容器(char*、std::string、自定义字符串类型)和格式(utf-8、utf-16、utf)中需要字符串的接口(interface)混合不当-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* 或其他任何内容,然后再将其作为函数参数传递,即。例如:

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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com