2014-01-10 3 views
6

우선,이 질문의 애매한 제목에 대해 유감스럽게 생각합니다. 나는 그것을 요약하는 방법을 확신하지 못했습니다.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

허, 나는 이것에 대해 전혀 생각하지 않았습니다. +1 –

+0

나도 그랬어. '내가 필요로 할 때까지 ;-) – JorenHeit

+0

이것은 [내 질문] (http://stackoverflow.com/q/9400581/212858)의 좀 더 일반적인 경우인데, 나는 그 대답을 두려워한다. 흥분하지 마라. – Useless

답변

2

사용할 수를 매크로 :

#define MAKE_FOO(value) \ 
    Foo<decltype(value), value>() 

사실, 컴파일 타임에 광범위한 기능 템플릿 make_something이 필요하다고 생각합니다. 불행히도, 나는 그것을 구현하는 방법을 모른다.

+0

나는 이것이 유일한 대답 인 것을 두려워했습니다. 물론 나는 이미이 옵션을 고려해 봤지만 매크로는 악합니다 ;-) 더 좋은 아이디어가 없다면 대답으로 표시됩니다. – JorenHeit

+0

동일한 접근 방식이지만 기본 템플릿 매개 변수는 무엇입니까? 'template '그러나 어떻게 든이 컴파일을하지 않을 것입니다 : D – Paranaix

+1

@Paranaix 기본 매개 변수가 오른쪽에서 채워 져야하기 때문에 작동하지 않을 것입니다. – mpark

0

당신은 같은 것을 할 수 ... 불필요한 것 같다

template <int Val> 
struct Foo<int, Val> 
{ 
    static MyEnum tag = myTag1; 
}; 


template <char Val> 
struct Foo<char, Val> 
{ 
    static MyEnum tag = myTag2; 
}; 
+0

그리고 목적은 무엇입니까? – Paranaix

+0

Foo와 을 구별 <'1'>에서 구별 하시겠습니까? –

+0

'int' 나'char'를'Foo'에 건네 주어야합니다. 이것은 피하고 싶습니다. 필자는 함수 오버로딩과 마찬가지로 컴파일러에서 형식을 추론하기를 원합니다. 쓸모없는 [게시] (http://stackoverflow.com/q/9400581/212858)는 정확하게 똑같은 문제에 관한 것이고, 그 다음 가능하지 않다는 결론을 내 렸습니다. – JorenHeit

1

컴파일 타임에 사용할 수있는 값이 필요하지만 실제로 유형 값의 일부로 필요하지 않은 경우 (마찬가지로 Foo<int, 1>Foo<int, 2>이 다른 유형이 될 필요가없는 경우) constexpr 생성자와 constexpr 함수는 컴파일시에 Foo 인스턴스를 발생시킵니다.

#define DECLTYPE_AUTO(expr) \ 
    -> decltype(expr) { return expr; } 

template <typename T> 
struct Foo { 

    constexpr Foo(T t) : value(t) {} 

    T value; 

}; // Foo 

template <typename T> 
constexpr auto MakeFoo(T val) 
    DECLTYPE_AUTO(Foo<T>(val)); 

static_assert(MakeFoo(2).value == 2, ""); 
static_assert(MakeFoo('1').value == '1', ""); 

int main() {} 
+0

흥미 롭 ... 그러나 나는 그것이 나에게별로 쓸모가 없다고 생각한다. 질문에 충분한 내용이 없다는 전적으로 내 잘못입니다. 질문 수정 됨 :-) – JorenHeit

관련 문제