2010-07-15 10 views
0

구조체 초기화 프로그램에서 const 문자열을 사용하는 큰 코드 기반으로 작업하고 있습니다. GNU gettext를 통해이 문자열을 최소한의 시간으로 번역하려고합니다. Case # 1이 작동하도록 default_value에 추가 할 수있는 일종의 변환 연산자가 있습니까?구조체 초기화 프로그램에서 const 문자열 번역

#include <cstring> 

template<int N> struct fixed_string 
{ 
    char text[N]; 
}; 

// Case #1 
struct data1 
{ 
    char string[50]; 
}; 

// Case #2 
struct data2 
{ 
    const char* string; 
}; 

// Case #3 
struct data3 
{ 
    fixed_string<50> string; 
}; 

// A conversion helper 
struct default_value 
{ 
    const char* text; 
    default_value(const char* t): text(t) {} 

    operator const char*() const 
    { 
     return text; 
    } 

    template<int M> operator fixed_string<M>() const 
    { 
     fixed_string<M> ret; 
     std::strncpy(ret.text, text, M); 
     ret.text[M - 1] = 0; 
     return ret; 
    } 
}; 

// The translation function 
const char* translate(const char* text) {return "TheTranslation";} 

int main() 
{ 
    data1 d1 = {default_value(translate("Hello"))}; // Broken 
    data2 d2 = {default_value(translate("Hello"))}; // Works 
    data3 d3 = {default_value(translate("Hello"))}; // Works 
} 
+0

있습니까? – ereOn

+0

std :: string을 사용하고 싶습니다! 불행하게도이 코드는 기존의 C 코드 (200,000 줄)입니다. 구조체 바이트는 그대로 네트워크를 통해 전송되기 때문에 전체 시스템을 대대적으로 다시 작성하지 않는 한 POD 만 허용됩니다. 불행히도 지금은 옵션이 아닙니다. –

+0

@bshields : C++ 태그를 제거한 특별한 이유. 예제에 제시된 코드는 명확하게 C++입니다. –

답변

2

data1 로의 직접 변환은 어떻게됩니까?

.. 
operator data1() const 
{ 
    data1 ret; 
    std::strncpy(ret.string, text, sizeof(ret.string)); 
    ret.string[sizeof(ret.string)] = 0; 
    return ret; 
} 
.. 

다음 : 당신이 당신의 문자열을 저장하기 위해`표준 : string`를 사용하지 않는 이유가

.. 
    data1 d1 = default_value(translate("Hello")); // should work now... 
.. 
+0

좋은 아이디어! 문제는 문자열 외에도 구조에 다른 멤버가 있다는 것입니다. 위의 코드는 테스트 케이스에 불과합니다. 실제 구조에는 문자열, 수레, 복식, 열거 형 값 등 100 개 이상의 멤버가 포함되어 있습니다. fixed_string을 사용하면 변환을 작성할 수 있지만 모든 배열을 fixed_string으로 업데이트해야합니다. 나는이 일을 할 수 있지만 더 나은 선택권을 우선 찾고 있습니다. –

+0

사례 # 3과 함께하기로 결정했습니다. 내가 예상했던 것보다 정적 크기의 배열이 적었고 템플릿 클래스를 사용하도록 변경 한 결과 부작용이 적었습니다. –

관련 문제