2014-09-16 2 views
2

이전에 question (내가 새 계정을 만든 이유는 묻지 않음)에서 테스트 클래스가 VLA를 작성하는지 묻습니다. answerer 또한이 제기 :다른 크기의 비 유형 매개 변수가있는 템플릿의 경우 오버로드 연산자 + =

하나 (가능성이 큰) 주름이 string_test<T, m>string_test<T, n> 때 다른 유형 m != n가 있다는 것입니다.

크기를 더한 새로운 string_test를 작성하면 쉽게 수정할 수 있습니다. 그러나 operator + =의 경우 크기 (더 정확하게는 개인 데이터 멤버 buffer[n])를 변경할 수 없기 때문에이 방법이 작동하지 않습니다.

template <typename U, size_t m> 
string_test<T, m + n> operator+(const string_test<U, m>& rhs) 
{ 
    char tmp[n + m]; // not VLA, size known at compile-time 
    strcpy(tmp, _buffer); 
    strcat(tmp, rhs._buffer); 
    return make_string(tmp); 
} 

operator+=는 기준 및 *this를 반환한다. operator+=을 구현하는 방법은 무엇입니까?

+1

고정 크기의 데이터 구조체를'+ ='하고 싶습니까? 그게 무슨 뜻일까요? – juanchopanza

+2

새 계정을 만든 이유는 무엇입니까? :) 그것은 좋지 않다. – gsamaras

+0

이 문제는 'buffer'는 변경할 수 없다고 주장하지만,이 코드에는'buffer'라는 변수가 없습니다. 또한'make_string'에 대한 호출이 유용하다고 생각하지 않습니다. –

답변

1

크기를 다른 크기로 지정하면 문자열 사용자의 크기가 (즉 변경할 수 없음)이라고 클래스의 사용자에게 알릴 수 있습니다. 이 문제는 간단한 C 스타일 배열 (int x[n])과 유사합니다. 요소를 배열에 추가 할 수는 없으며 대신 이전 요소 + 추가 요소를 보유 할 수있는 새 버퍼를 만들어야합니다.

표준 C++ 배열 클래스 std::array<T, N>은 같은 방식으로 구현되지만 정적 크기의 배열을 감싸는 래퍼이기 때문에 크기를 늘릴 수있는 삽입 연산을 제공하지 않습니다.