c ++ cast overload等价物

Van*_*ing 3 c# c++ casting

我想知道在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::stringA.

  • 另请注意,C++构造函数默认为_implicit_ - 即编译器可以使用它们进行自动类型转换.如果要禁止此参数,请在单参数构造函数之前添加_explicit_关键字. (2认同)