我想知道在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;
}
}
Run Code Online (Sandbox Code Playgroud)
在C++中它应该是这样的:
#include <string>
using namespace std;
class A{
/*SOME CAST OVERLOADING GOES HERE*/
};
void main(){
A a = "hello";
A b = 5.0;
}
Run Code Online (Sandbox Code Playgroud)
你能帮助我如何使这个演员超载吗?
Ker*_* SB 16
这通常通过构造函数实现:
class A
{
public:
A(const std::string & s) { /*...*/ }
A(double d) { /*...*/ }
//...
};
Run Code Online (Sandbox Code Playgroud)
用法: A a("hello"), b(4.2), c = 3.5, d = std::string("world");
(如果声明构造函数explicit,则只允许第一个表单(带有括号的"直接初始化").否则这两个表单完全相同.)
由于这个原因,单参数构造函数也称为"转换构造函数":您可以使用它来构造来自其他对象的对象,即"转换"a double,比如说,转换为A.
隐式转换被广泛使用.例如,它适用于以下情况:
void f(A, const A&) { /* ... */ }
int main() { f(1.5, std::string("hello")); }
Run Code Online (Sandbox Code Playgroud)
这种构造的临时A(1.5)和A("hello")并通过他们f.(Temporaries也绑定到常量引用,如第二个参数所示.)
更新:(致信@cHao查询.)根据标准(12.3.4),"最多一个用户定义的转换(构造函数或转换函数)隐式应用于单个值." (这指的是隐式转换;直接初始化a la A a("hello");不属于这个*.请参阅此相关问题.)所以很遗憾你不能说f("hello", "world");.(当然你可以添加一个const char *构造函数,在新的C++ 11中你甚至可以毫不费力地转发给字符串构造函数.)
*)我认为这实际上有点微妙.只有用户定义的转换才会受到规则的影响.所以第一关,你得到一个根本性的转换char (&)[6]到const char *免费的.然后你得到一个隐式转换const char *到std::string.最后,你有一个明确的转换,建设std::string到A.