내가 템플릿 특수화의 주위에 내 머리를 정리하려고 이해하지, 나는 조금 혼란 스러워요 (는 C++ 템플릿 전문화 그리고 상수
예 1 (아마도 무엇인가 실제로 유형 이름, 또는 컴파일러가 무엇을 기대하고 이해되지 않음) 컴파일)
template <typename A, typename... Args>
class Example
{
public:
Example(){}
virtual ~Example(){}
};
template <typename A, typename... Args>
class Example<A, int, Args...>{
Example(){}
virtual ~Example(){}
};
예 2 (컴파일)
template <typename A, int, typename... Args>
class Example
{
public:
Example(){}
virtual ~Example(){}
};
template <typename A, typename... Args>
class Example<A, 2, Args...>{
Example(){}
virtual ~Example(){}
};
예 3 (실패)
template <typename A, typename... Args>
class Example
{
public:
Example(){}
virtual ~Example(){}
};
template <typename A, typename... Args>
class Example<A, 2, Args...>{
Example(){}
virtual ~Example(){}
};
오류이다
오류 : 타입/'템플릿 클래스 템플릿 파라미터리스트에서 인자 2의 값이 일치 예
을 질문 :
우선, 저는 제네릭 프로그래밍을 처음 접했고, 나는 그에게 t 개의 질문. 컴파일러 사양 용어는 나에게 아직 조금 외견이다.
- 무슨 일입니까? 컴파일러가 상수를 typename으로 처리하려고합니까?
- typename을 int로 특수화 할 수 있고 int를 2로 특수화 할 수있는 이유는 typename을 2로 특수화 할 수없는 이유는 무엇입니까?
- int 또는 enum을 사용하여 클래스를 특수화하는 "적절한"방법은 무엇입니까?
- 올바른 질문을하고 있습니까?
내가 (Yakk의 설명에서) 무슨 일이 일어나고 있는지 이해 한 후, 여기 내 최종 솔루션이 같은 모습입니다 :
당신에게
EDIT/솔루션을 감사드립니다. C++ 전문가 중 한 사람이 "다른 추상 레이어를 추가하여 문제를 해결할 수 있습니다."라고 읽었습니다. D
enum ETypes
{
UNKNOWN = 0,
INT = 1,
FLOAT = 2,
STRING = 3,
FUNC = 4,
};
// This is to use the ETypes as a type.
// Note that T is not a type, hence use it as RHS
template<ETypes T>
class ETypeName
{
public:
ETypes type = T;
};
// The example
template <typename A, typename... Args>
class Example
{
private:
Example(); // Hide the constructor as private
// to generate compilation error
virtual ~Example(){}
};
// LOOK! We can use the Enum to specialize the class.
template <>
class Example<ETypeName<ETypes::INT>>{
public:
ETypes mType;
Example():mType(ETypes::INT){}
virtual ~Example(){}
};
를 메인에() : 지금은 그게 무슨 뜻인지
Example<ETypeName<ETypes::INT>> x;
// This can't happen. Private constructor. Not specialized yet
// Example<ETypeName<ETypes::FLOAT>> x1;
비 유형 템플리트 매개 변수는 유형 템플리트 매개 변수와 다릅니다. 본질적으로 그렇습니다. 2는 유형이 아닌 매개 변수로 취급되지만 템플릿 클래스는 유형을 기대합니다. – user975989
아, 그게 내가 빠졌던 것입니다. – Makketronix