gpt4 book ai didi

c# - c++ 强制转换重载等效

转载 作者:太空狗 更新时间:2023-10-29 19:37:34 24 4
gpt4 key购买 nike

我想知道是否有可能在 C++ 中实现与此 C# 示例中相同的强制转换重载:

class A {
public static implicit operator A(string s) {
return new A();
}
public static implicit operator A(double d) {
return new A();
}
static void Main(string[] args) {
A a = "hello";
A b = 5.0;
}
}

在 C++ 中它应该是这样的:

#include <string>
using namespace std;

class A{
/*SOME CAST OVERLOADING GOES HERE*/
};


void main(){
A a = "hello";
A b = 5.0;
}

你能帮我如何让这个转换重载吗?

最佳答案

这通常是通过构造函数实现的:

class A
{
public:
A(const std::string & s) { /*...*/ }
A(double d) { /*...*/ }
//...
};

用法:A a("hello"), b(4.2), c = 3.5, d = std::string("world");

(如果您声明构造函数显式,则只允许第一种形式(“直接初始化”,带括号)。否则这两种形式完全相同。)

单参数构造函数也被称为“转换构造函数”,原因就在于:您可以使用它从其他对象构造一个对象,即“转换”一个double,比如说,到 A

隐式转换被广泛使用。例如,它将适用于以下情况:

void f(A, const A&) { /* ... */ }

int main() { f(1.5, std::string("hello")); }

这会构造临时变量 A(1.5)A("hello") 并将它们传递给 f。 (临时对象也绑定(bind)到常量引用,正如您在第二个参数中看到的那样。)

更新:(感谢@cHao 查找此信息。)根据标准 (12.3.4),“最多隐式应用一个用户定义的转换(构造函数或转换函数)到一个单一的值(value)。” (这指的是隐式转换;直接初始化 a la A a("hello"); 不属于这个*。参见 this related question。)很不幸你不能说 f("hello", "world");。 (当然,您可以添加一个 const char * 构造函数,在新的 C++11 中,您甚至可以毫不费力地将其转发到字符串构造函数。)

*) 我认为这实际上更微妙一些。只有用户定义的 转换受规则影响。因此,首先,您可以免费获得从 char (&)[6]const char * 的基本转换。然后你得到一个从 const char *std::string 的隐式转换。最后,您有一个从 std::stringA显式转换构造。

关于c# - c++ 强制转换重载等效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8138818/

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