2013-06-12 4 views
2

여러 컨테이너 (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 컴파일러가 없어서 캐스트 연산자를 명시 적으로 표시 할 수 없습니다.

답변

1

내가 포인터 타입 (char, wchar_t 및 중 uint16_t 또는 uint32_twchar_t 32 또는 16 비트인지에 따라) 모든 문자 및 basic_string에 캐스트 연산자 다른 도우미 캐스트 연산자 한 도우미를 작성 결국 (하나에 전문 비표준 유형에 대한 사용자 정의 특성 사용). 그것은 어느 곳에서도 모호하지 않은 것처럼 보입니다.

1

make_x()의 결과를 명시 적으로 캐스팅하므로 std::string, const char* 또는 무엇이든 함수 인수로 전달합니다. 예 : g :이 많은 작업을 수행하고 캐스트 운영자에게 짧은 이름 부여 장황 생각해야하는 경우

std::string y(static_cast<const char*>(make_x())); 

: 목적에 safe bool idiom 적응이 너무 받아 들일 수없는 경우

struct X { 
    std::string str() { return std::string("string x"); } 
    const char *cstr() { return "zstring x"; } 
}; 

std::string y(make_x().str()); 

을 .

+0

정적 캐스팅이 작동하지 않습니다. 질문에 언급되어 있습니다. 안전한 bool 관용구는 bool에 _implicit_ 변환을 가지고 있지만 char *에 대한 암시 적 변환이없는 유형의 존재에 의존합니다. –

+0

그래, 안전한 bool 관용구 (뇌 방귀)에 관한 부분은 잊어 버려. 나는 호기심을 느낀다. 명시 적 형변환은이 인스턴스에서는 작동하지 않는다. 정확히 무엇이 필요한지에 따라 멤버 함수는 아마도 가장 쉬운 방법 일 것입니다. –

+0

함수 호출 캐스트는 "임시로 구성"을 의미하므로 가변 구조만큼 모호하지 않습니다. 나는 또한'static_cast'가 존재할 경우에만 캐스트 연산자를 사용할 것으로 예상했지만 불행히도 똑같은 일을하고 모든 생성자를 시도합니다. –