gpt4 book ai didi

没有类的 C++ 用户定义转换运算符?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:04:44 25 4
gpt4 key购买 nike

在 C++ 中是否可以定义不是类成员的转换运算符?我知道如何为常规运算符(例如 +)执行此操作,但不知道如何为转换运算符执行此操作。

这是我的用例:我使用一个 C 库,它给我一个 PA_Unichar *,其中库将 PA_Unichar 定义为 16 位 int。它实际上是一个以 UTF-16 编码的字符串。我想将其转换为以 UTF-8 编码的 std::string。我已经准备好所有转换代码并可以正常工作,我只是缺少允许我编写的语法糖:

PA_Unichar *libOutput = theLibraryFunction();
std::string myString = libOutput;

(通常在一行中没有临时变量)。

另外值得注意的是:

  • 我知道 std::string 没有定义从 char* 的隐式转换,我知道为什么。同样的原因可能适用于此,但这不是重点。

  • 我确实有一个 ustring,它是 std::string 的子类,它定义了来自 PA_Unichar* 的正确转换运算符。它有效,但这意味着使用 ustring 变量而不是 std::string 并且 then 需要转换为 std::string 当我将这些字符串与其他库一起使用时。所以这并没有多大帮助。

  • 使用赋值运算符不起作用,因为那些必须是类(class)成员。

那么是否可以在您无法控制的两种类型之间定义隐式转换运算符(在我的例子中是 PA_Unichar*std::string),这可能或可能不是类类型?

如果不是,有什么解决方法?

最佳答案

免费功能有什么问题?

std::string convert(PA_Unichar *libOutput);

std::string myString = convert(theLibraryFunction());

编辑 回复评论:

作为DrPizza says :其他人都试图通过将隐式转换替换为您称之为“视觉困惑”的那些显式转换来填补隐式转换打开的漏洞。

至于临时字符串:就等下一个编译器版本吧。它可能带有右值引用,它的 std::string 实现将在此基础上实现移动语义,从而消除了复制。我还没有看到比简单地升级到新的编译器版本更便宜的加速代码的方法。

关于没有类的 C++ 用户定义转换运算符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1618039/

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