우선,이 질문의 애매한 제목에 대해 유감스럽게 생각합니다. 나는 그것을 요약하는 방법을 확신하지 못했습니다.C++ 템플릿 전문/오버로드
달성하고자하는 것은 다음과 같습니다. 다른 유형의 템플릿이 아닌 유형 매개 변수를 동일한 클래스 템플릿에 전달하여 다른 인스턴스를 생성 할 수 있기를 바랍니다. 이런 식으로 뭔가 :
Foo<1>();
Foo<'1'>(); // different types of object
나는이 생각하지 않습니다 그러므로 내가 좋아하는 뭔가를 강요하고있어, 수이
template <typename T, T Val>
struct Foo;
template <int Val>
struct Foo<int, Val>
{};
template <char Val>
struct Foo<char, Val>
{};
//...
Foo<int, 1>();
Foo<char, '1'>();
같은 Foo
첫 번째 템플릿 매개 변수를 기반으로 전문화 될 수있다. 그러나 이것은 메타 프로그래밍 프레임 워크에서 구현하려고하는 미니 언어의 구문을 복잡하게합니다. Foo<1>
과 Foo<'1'>
을 구별 할 수있는 기술이 있습니까? 기본적으로 컴파일 타임 플래그 (열거 형)를 설정하여 명시 적으로 지정하지 않고 int
또는 char
이 전달 된 것을 나타냅니다.
편집 내 대답은 내가 실제로 이러한 개체의 인스턴스 (컴파일 타임)가 필요하다는 것을 알게되었습니다. 내가하지 ... 어떻게 든 표준 Foo<1>
및 Foo<'1'>
다른 종류, 그들의 flag
필드에 다른 값을 포함하도록 클래스 템플릿에 과부하가 저를 허용 할
말. ,
template <typename FooType>
struct Bar
{
typedef typename If < FooType::flag, int, char >::Type Type;
};
이 명시 적으로 타입을 전달 대해 아무것도 없을 때 할 모든 매우 간단합니다 :이 유형은 다음 자체는 예를 들어, 그들을 검사하고 그것으로 흥미로운 물건을 할 수있는 또 다른 클래스 템플릿에 전달 될 수있다 그러나 이것은
허, 나는 이것에 대해 전혀 생각하지 않았습니다. +1 –
나도 그랬어. '내가 필요로 할 때까지 ;-) – JorenHeit
이것은 [내 질문] (http://stackoverflow.com/q/9400581/212858)의 좀 더 일반적인 경우인데, 나는 그 대답을 두려워한다. 흥분하지 마라. – Useless