2016-06-04 2 views
-1

다양한 (C++ 11 std :: string-change-related) 이유 때문에 비 표준 :: 문자열을 사용하고 싶습니다. 문자열 클래스를 C++ 11-ish 코드의 일부 위치에서 사용할 수 있습니다.이 코드는 여러 버전의 여러 C++ 컴파일러와 호환되어야합니다.std :: string이 아닌 이식 가능한 std :: string과 같은 문자열 클래스

이제는 내 문자열이 pre-C++ 11- 스타일 또는 post-C++ 11 방식으로 동작하는지 여부를 신경 쓰지 않습니다. 나는 성능에 대해서도 신경 쓰지 않는다. 나는 어떤 상황에서도 나를 std::__cxx11::string과 같은 부두교와 관련된 오류를주는 안정적인 문자열 클래스를 원한다.

내 옵션에는 어떤 것이 있습니까? 필자는 자신의 헤더 파일에 단일 컴파일러의 구현을 복제 할 수 있습니까? GCC의 vstring은 옵션입니까? 다른 것?

+0

"문자열 형"의 자격 요건은 무엇입니까? C++ 11이 변경 한 이유 중 일부는 새 버전이 스레드로부터 안전하다는 것입니다. 당신이 구체적으로 원하는 것이 무엇인지 명확히 할 수 있습니까? 두 유형의 문자열로 변환 할 수 있도록 하시겠습니까? 왜 프로젝트에서 적절한 경계에서 두 유형을 변환 할 수 없는데 왜 세 번째 유형의 문자열이 필요합니까? C++ 11에서 새로운 문자열 유형을 사용하여 모든 코드와 관련 라이브러리를 다시 컴파일 할 수없는 이유는 무엇입니까? –

+0

@ChrisBeck :'std :: string'의 메소드를 구현했다고합시다. 또는 좀 더 겸손하고 싶다면 - 맵 키로 사용할 수 있고'.c_str()'과 같은 것을 사용할 수 있습니다. 스레드 안전은 필수 사항은 아닙니다. – einpoklum

+0

당신이 언급 한 모든 가능성이 옵션이라고 생각하십니까? 문제는 그들 중 어떤 것도 제거 할만큼 충분한 정보를 담고 있지 않습니다. 자신 만의 역할을 맵 키로 사용할 수 있고 5 분 이내에'.c_str() '을 가질 수 있습니다. –

답변

0
template<class T> 
struct crappy_string { 
    mutable std::vector<T> buffer; 
    T const* c_str() const { 
    if (buffer.empty() || buffer.back()) 
     buffer.push_back(0); 
    return buffer.data(); 
    } 
    friend bool operator<(crappy_string const& lhs, crappy_string const& rhs) { 
    lhs.c_str(); rhs.c_str(); // ensure null terminator in both 
    return lhs.buffer < rhs.buffer; 
    }  
}; 

이것은 사용자가 의견에 제시 한 최소 요구 사항을 충족시킵니다.

+0

주문한지도에서만 작동합니다. 그러나 요점. 나는 의견의 모든 방법을 포기하지 말았어야했는데 좋은 협상이 아니 었습니다 .-( – einpoklum

관련 문제