gpt4 book ai didi

C++ 重载转换运算符 hack

转载 作者:搜寻专家 更新时间:2023-10-31 02:13:06 25 4
gpt4 key购买 nike

我正在尝试实现一个 hack,我试图在其中重载 return。我会让代码说话。

namespace tcn
{
class foo
{
std::string blah;

public:
class proxy
{
int intval;
std::string strval;
public:
proxy(int intv, std::string strv) : intval(intv), strval(strv) {};
operator int() const { return intval; }
operator std::string() const { return strval; }

};

foo();
~foo();

proxy get();
};

foo::foo()
{
// Create stuff //
}

foo::~foo()
{
// Destroy stuff //
}

foo::proxy foo::get()
{
int intval = 911;
std::string strval = "Hello!?";

proxy temp(intval, strval);

return temp;
}
}



int main()
{
tcn::foo bar;

std::string ts = bar.get(); // OK
int ti = bar.get(); // OK

ti = bar.get(); // OK

ts = bar.get(); // Compile error here

return 0;
}

如果我尝试编译代码,它会给出如下错误

error: ambiguous overload for 'operator=' (operand types are 'std::string {aka std::basic_string}' and 'tcn::foo::proxy')
ts = bar.get();

我想知道如何克服这个问题。我已经看到其他通过使用“提示”来实现此目的的方法,但我正在尝试为用户提供一个简单的界面。所以我正在寻找来自用户端的简单分配。这还能如何实现?

提前谢谢你,如果这看起来很蹩脚 - 我道歉。我的 C++ 不太好。

最佳答案

该调用不明确,因为 std::string::operator= 具有采用 std::stringchar 的重载。这两个都可以使用 tcn::proxy 调用:第一个使用 std::string 转换运算符,第二个使用 int 转换运算符后跟整数转换。

通常重载决议更喜欢没有必要标准转换的隐式转换序列而不是需要整数转换的隐式转换序列,但只有当两个转换序列通过相同的函数时才会考虑这种选择。由于您有两条独立的路径通过两个不同的函数,因此调用不明确。

解决方案是不要对此类事情使用整数转换;它只会导致奇怪的边缘情况、令人惊讶的行为和隐藏的错误。

关于C++ 重载转换运算符 hack,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41849005/

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