여러 컨테이너 (char *, std :: string, 사용자 정의 문자열 유형)의 문자열을 필요로하는 인터페이스가 혼합되어 있고 형식이 잘못되어 문자열 변환 유틸리티를 만들려고합니다. (utf-8, utf-16, utf-32). 그래서 저는 캐스트 연산자를 사용하여 다양한 유형의 래퍼를 만드는 아이디어를 얻었습니다. 이처럼 :대상 클래스에 여러 생성자가있는 경우 캐스트 연산자를 분명한 것으로 바꿉니다.
#include <iostream>
#include <string>
struct X {
operator std::string() { return std::string("string x"); }
operator const char *() { return "zstring x"; }
};
X make_x() { return X(); }
int main()
{
std::string y = make_x(); // this works
std::string y(make_x()); // but this does not
y = make_x(); // this does not work either
y = std::string(make_x()); // nor does this, so it's about useless
std::cout << y << std::endl;
return 0;
}
그러나 문제는 유형이 모두 char *
및 std::string
로 변환하는 경우 std::string
생성자와 할당이 두 유형 간의 모호 할 것입니다. 그리고 문자열은 원래 nul이 끝나기보다는 범위에 의해 주어질 수 있기 때문에, 단지 char *
을 통과하기를 원하지 않습니다.
그래서이를 모호하게하는 방법이 있습니까?
중요 : 일부 C++ 03 컴파일러가 없어서 캐스트 연산자를 명시 적으로 표시 할 수 없습니다.
정적 캐스팅이 작동하지 않습니다. 질문에 언급되어 있습니다. 안전한 bool 관용구는 bool에 _implicit_ 변환을 가지고 있지만 char *에 대한 암시 적 변환이없는 유형의 존재에 의존합니다. –
그래, 안전한 bool 관용구 (뇌 방귀)에 관한 부분은 잊어 버려. 나는 호기심을 느낀다. 명시 적 형변환은이 인스턴스에서는 작동하지 않는다. 정확히 무엇이 필요한지에 따라 멤버 함수는 아마도 가장 쉬운 방법 일 것입니다. –
함수 호출 캐스트는 "임시로 구성"을 의미하므로 가변 구조만큼 모호하지 않습니다. 나는 또한'static_cast'가 존재할 경우에만 캐스트 연산자를 사용할 것으로 예상했지만 불행히도 똑같은 일을하고 모든 생성자를 시도합니다. –