2014-04-01 2 views
1

나는 클래스 템플릿을함수 템플릿 내에서 템플릿 전문화를 선언하는 방법은 무엇입니까? 가정하자

template<int I, int J> class bar { /* ... */ }; 

을 가지고 있고 (고정) 바인딩 두 번째 템플릿 인수로 bar 동일 C 다음과 같은 템플릿 템플릿

template<template<int> class C> 
struct foo { void func(some_type arg); }; 

를 사용하고 싶습니다. 이를 달성하는 방법 중 하나는 바로이 목적을 위해 보조 클래스 (use_foo_helper)이 매우 불편 생성, 그러나

template<int J, template<int, int> class B> 
struct use_foo_helper { 
    template<int I> using BJ = B<I,J>; 
    static void func(some_type arg) { foo<BJ>::func(arg); } 
}; 
template<int J> 
void foo_bar(some_type arg) { use_foo_helper<J,bar>::func(arg); } 

입니다. 차라리 그냥 함수 템플릿 foo_bar을 정의 할 좋아하지만 실패합니다 :

template<int J> 
void foo_bar(some_type arg) 
{ 
    // template<int I> using barJ = bar<I,J>; // this appears to be illegal 
    // for<barJ>::func(arg); 
    foo<???>::func(arg);      // what shall I put in place of ??? 
}; 

Q 헬퍼 클래스를 방지 할 수있는 방법이 있나요? Q 더 좋은 디자인 패턴이 있습니까?

답변

1

당신은 다음과 같은 방법으로이 작업을 수행 할 수 있습니다 사용

template <int I, int J> 
class bar{}; 

template <template<int> class C> 
struct foo 
{ 
    static 
    void func(some_type arg){} 
}; 

template <int J> 
class foo_bar 
{ 
    template <int I> 
    using barJ = bar<I, J>; 

public: 

    static 
    void call(some_type arg) 
    { 
     foo<barJ>::func(arg); 
    } 
}; 

예 : foo_bar</*...*/>::call(/*...*/);합니다. 당신이 당신의 클래스 템플릿의 하나 개의 매개 변수를 수정 만하려는 경우

그러나 그것은 간단하게 수행 할 수 있습니다

template <int J> 
struct barJ 
{ 
    template <int I> 
    using type = bar<I, J>; 
}; 

예를 사용 : foo<barJ</*...*/>::type>::func(/*...*/);.

+0

여전히 보조 헬퍼 클래스'foo_bar'와'barJ'를 사용합니다. 그래서 당신은 그 사람들은 피할 수 없다고 말하고 있습니까? 그렇다면 이것을 증명할 수 있습니까? – Walter

+0

@Walter 죄송합니다. 질문을 부지런히 읽었습니다. 예, 저는 헬퍼 클래스 사용을 피할 수 없다고 생각합니다. 아니, 나는 이것을 증명할 수 없다. 하지만 당신도 템플릿을 로컬 클래스의 멤버로 선언 할 수 없다는 것을 알고 있습니다 (14.5.2/2 참조). 그래서 ... – Constructor

관련 문제