2015-11-28 226 views
1

如何获取类模板以接受可能具有两个不同参数列表之一的另一个类模板?也就是说,非类型参数或类型和非类型参数:部分专门化具有不同模板参数的模板的模板类

template <int X> 
struct Foo1{}; 

template <typename T, int X> 
struct Foo2{}; 

我希望能够为任一这些模板传递给我的模板(加上跟随他们的脚步未来模板)。我希望这说明了我后,虽然语法是全错:

template <typename T, int X, class> 
struct Magic; //Don't accept non template parameters 

template <typename T, int X, class <int> class C> 
struct Magic<T, X, C> {}; //Template non-type 

template <typename T, int X, class <class, int> class C> 
struct Magic<T, X, C> {}; //Template type and non-type 

我想不出一种方法来写这些专业化。如果这是不可能的,我可以只有Foo1,并且像它这样的所有模板都有一个模板类型参数,该模板类型参数不会执行任何操作(template <typename, int X> Foo1{};)并且写入Magic,但我希望获得更优雅的解决方案。

+2

[唯一](http://coliru.stacked-crooked.com/a/ac1f9446d910331d)解决方案,我能想到的 –

+0

@PiotrSkotnicki辉煌!如果你想让它成为答案,那肯定会回答这个问题。 –

回答

3

您可以应用的一种解决方案是为每个不同类模板的声明引入包装,并根据包装包装的内容来专门设计不可思议的结构。最终你需要知道的唯一事情是哪个包装器与哪个类模板相关联。

template <int X> 
struct Foo1{}; 

template <typename T, int X> 
struct Foo2{}; 

template <template <int> class C> struct W1; 

template <template <class, int> class C> struct W2; 

template <typename T, int X, class> 
struct Magic; //Don't accept non template parameters 

template <typename T, int X, template <int> class C> 
struct Magic<T, X, W1<C> > {}; //Template non-type 

template <typename T, int X, template <class, int> class C> 
struct Magic<T, X, W2<C> > {}; //Template type and non-type 

int main() 
{ 
    Magic<int, 1, W1<Foo1> > m1; 
    Magic<int, 2, W2<Foo2> > m2; 
} 

DEMO