2012-11-27 2 views
2

개체의 멤버가 입력과 같은지 확인하기 위해 비교자를 작성했습니다. 이것은 char []와 같은 멤버를 제외하고는 매력처럼 작동합니다.char 형 멤버에 대한 템플릿 서명

저는 인터넷, C++ ISO 표준을 검색해 보았지만 많이 시도했지만 이해할 수는 없습니다.

/* 
* main.cpp 
* 
* Created on: Nov 17, 2012 
*  Author: martijn 
*/ 

#include <string.h> 

class Data { 
public: 
    Data() { 
     strcpy(Name, "MyCharArray"); 
    }; 
    virtual ~Data(); 

    char Name[12]; 
}; 

template <class ClassT, char (ClassT::*Name)[]> // What should be here?! 
class Comparator { 
public: 
    Comparator() {}; 
    ~Comparator() {}; 
}; 

int main() { 

    Comparator<Data, &Data::Name> comparatorArray; 

    return 0; 
} 

문제 영역은 (적어도 그게 내가 그것을 만드는 기능) 코드에 표시됩니다 :

이 단순화 된 코드입니다. 현재 코드가 올바르지 않습니다. 컴파일러는 말한다 :

오류 :에 템플릿 인수 '& 데이터 :: 이름을'변환 할 수 없습니다 '문자 (데이터 :: *) []'당신은 템플릿 매개 변수 형식으로 바인드 된 배열을 지정해야합니다

+0

std :: string을 사용하면 생활이 단순 해 집니까? 그리고 호기심에 대한 : 당신은이 패턴을 위해 무엇을 사용합니까? – Zane

+0

물론 std :: string은 더 간단 할 것입니다. 하지만 포트란 코드에는 많은 유산과 인터페이스가 있습니다. 많은 수의 클래스에서 가능한 모든 멤버에 대해 비교자를 필요로합니다. 그래서 저는 그것의 템플릿 버전을 원했습니다. – user1290034

+0

이것이 유용 할 수있는 곳을 알려줍니다. 레거시 코드가없는 C++ 아키텍처에서 유용 할 것으로 기대하지는 않겠지 만 달리 말하면 신경 쓰지 않아도됩니다. – Zane

답변

3

:

template <class ClassT, char (ClassT::*Name)[12]> 

또는 가능 :

template <class ClassT, std::size_t N, char (ClassT::*Name)[N]> 

및 사용 :

// Note, this is a declaration of a function, is this correct? 
Comparator<Data, 12, &Data::Name> comparatorArray(); 
+0

찰스 고마워! – user1290034

0

이런 종류의 질문에 대답하는 쉬운 방법은 컴파일러 오류 메시지를 사용하는 것입니다.

매개 변수를 전달할 때 괄시 적으로 컴파일하지 못하는 일반 매개 변수를 사용하여 템플릿 함수를 만듭니다. 그런 다음 오류 메시지를 보면 대개 T가 무엇인지 알려줍니다. 내 전통적인 컴파일은 크기가 0 인 배열입니다. 컴파일러가 똑똑한 경우 int x[sizeof(T)-sizeof(expression with the same type as your test var)]을 사용하지만 게으른 컴파일러에서는 0 만 사용할 수 있습니다.

관련 문제