2016-06-23 18 views
0

C++에 이러한 기능이 있는지 잘 모르겠습니다. 제대로 작동하지 않는 것 같아서 물어보기로했습니다. 템플릿 템플릿이 아닌 유형 매개 변수를 사용할 수 있습니까? 이런 식으로 뭔가 :템플릿 템플릿 non-type 매개 변수

template<template<int> class A, int num> 
class C 
{ 
private: 
    A<num> obj; 
}; 

내 주요 문제는 내가 템플릿 매개 변수로이 개 클래스를 받아들이는 클래스 C를 갖고 싶어한다는 것입니다. 이 두 클래스는 타입이 아닌 매개 변수 (예 : A < 5>, B < 5>)를 전문으로하며 두 클래스를 템플릿 매개 변수로 받아들이는 클래스 C에 전달하려고합니다. 그러나이 두 클래스 모두 같은 비 유형 매개 변수를 전문으로해야합니다. 예를 들어 < 3>, B < 4>는 C 클래스의 인수로 허용해서는 안됩니다.

+2

예 가능합니다. – Jarod42

답변

1

당신은 "makeC"당신의 코드를 단순화 할 수 있습니다 :

#include <iostream> 

template <template<int> class A, template<int> class B, int N> 
class C { 
    A<N> a; 
    B<N> b; 
}; 

using namespace std; 

template <template<int> class A, template<int> class B, int N> 
C<A,B,N> makeC(A<N> a, B<N> b) { 
    return C<A, B, N>{}; 
} 

template<int N> 
class AImpl { 

}; 

template<int N> 
class BImpl { 

}; 


int main() { 
    auto c = makeC(AImpl<2>{}, BImpl<2>{}); 
    //auto error = makeC(AImpl<1>{}, BImpl<2>{}); 

    return 0; 
} 
+0

AImpl이 더 많은 템플릿 인수 (예 : )를 사용한다고해서 클래스 C에서 템플릿 클래스 매개 변수를 숨길 수 있습니까? AImpl <5>과 같은 것 (기본적으로 클래스 C는 약 SomeClass를 알 필요는 없지만 약 5 개를 알아야합니다. – lightxbulb

+0

SomeClass는 A와 B 사이에서 동일해야합니까? – Arkadiy

+0

실제로는 클래스 C에서 숨길 수는 없습니다. 기본적으로 'template