2017-11-06 13 views
0

유사 이전의 질문이 있지만, 모든 사람이 물어 찾을 수있는 다른 질문 :static_cast 또는 toX()에 대한 "명시 적 연산자 X"에 의한 유형 변환?

  • static_cast vs. direct call to conversion operator-
  • 많은 이야기에 대한 static_cast (C 스타일 캐스트 대 자주 언급 static_cast<string>(x)x.operator string() 대 관련 있지만 다른에 대해 설명 특급를 구현하는 방법을 결정할 때 고려해야 할 것은 무엇인가 그것에

) 함수 스타일의 캐스팅으로 클래스에 대한 불법적 인 변환? 내가 함수 toX()을 가질 수

class myClass { 
public: 
    explicit operator std::string() const { 
     ... 
    } 
}; 
const myClass x{...}; 
std::string str = static_cast<std::string>(x); 

또는 :

C++ 11에서

, 내가 명시 적 변환 연산자를 가질 수

class myClass { 
public: 
    std::string toString() const { 
     ... 
    } 
}; 
const myClass x{...}; 
std::string str = x.toString(); 

부분은 동일한 것 생각 하지만 일부는 시나리오 나 모범 사례 지침을 놓치고 있다고 생각합니다. , static_cast 부여

myClass::explicit operator std::string() 또는 std::string(myClass)를 호출 할 수 있습니다,하지만 난 결정이 std::string()가 변환 생성자가없는 경우 변환이 여기처럼 myClass 내에서 일어날 갖도록 제조 된 지점에서에 집중 해요 그래서이 구별은 작용하지 않습니다. 또한 상속 계층 구조 사이에서의 형 변환도 허용하지만, 여기에서도 문제가되지 않습니다.

답변

0

여러분의 클래스가 std::string으로의 변환이 실제로 의미가있는 문자열과 "충분"하다고 가정 할 경우 두 가지를 모두 구현하는 것이 좋습니다. (물론, 하나 개의 멤버 함수는 다른 전화를 걸 수 있습니다.)

내가 직접 초기화로 작성, 실제로 명시 적 변환을 사용하여 명명 된 객체를 생성 할

때로는 더 자연스러운 약간입니다 :

std::string s1{ x };   // Plain conversion. 
std::string s2 = x.toString(); // More verbose - could be good or bad 

하지만 명명 된 객체가 필요하지 않을 때, 멤버 함수를 호출하면 훨씬 좋네요 보이는 캐스트의 형태 사용할 필요보다 :

f(static_cast<std::string>(x)); // Blah. 
f(x.toString());    // Convenient. 

를 그냥 일을 그 두 가지 방법을 문서화해야합니다 그것은 동일합니다.