2015-11-05 38 views
3

我有一些代码大量使用模板类。这是可能的,但不希望在这一点上改变现有的代码库。我需要编写一个新的类,这个类将作用于两个模板类(就这个问题而言)是任意的,除了有一个通用模板参数。一个简单的例子:链接的模板模板参数 - 约束内部参数是相同的

template<typename T> 
class A { 
    // Implementation details 
}; 

template<typename T> 
class B { 
    // Implementation details 
}; 

template<typename T, typename X<T>, typename Y<T>> // This syntax is invalid! 
class C { 
    // Implementation details 
}; 

我需要写类C。示例中显示的语法提示我想要做什么,但不起作用。这里的模板参数XY必须通过采用相同的模板参数T“绑在一起”。除此之外,它们可以是任意的。

这意味着什么“喜欢” C<std::string,A<std::string>,B<std::string>>应该是有效的,但C<std::string,A<std::string>,B<std::map>>不应该因为AB不具有相同的模板参数。 (“喜欢”的报价再次表示语法仍然是错的上述C声明)

其他尝试(这也失败了)包括:

  • template<typename T, template<typename> class X<T>, template<typename> class Y<T>>
  • template<typename T> template<typename X<T>, typename Y<T>>

是这样的可能吗?如果是这样,语法是什么?

谢谢!

+1

只需使用'模板类X,模板类Y>'然后'X '和'ÿ'无论你在你的'C'需要。 – Rostislav

回答

5

你可以局部专门C

//Primary template 
template<typename T, typename X, typename Y> 
class C; 

//Specialization for when the template parameters are the same 
template<typename T, template <typename> class X, template <typename> class Y> 
class C <T, X<T>, Y<T>> { 
    // Implementation details 
}; 

如果再使用无效的模板参数,你会得到一个编译时错误。

Live Demo

+0

这个答案做了我想要的。随着一些更多的修补,我能够进一步改进它,使得参数“T”不需要由用户明确提供。主模板是'模板<类型名称X,类型名称Y>类别C',专业化是'模板<模板类别X,模板类别Y,类型名称T>类别C ,Y >'。 – Brick

+0

@Brick与答案有何不同? – einpoklum

+1

@einpoklum主模板有一个较少的参数,然后逐渐下降到稍微简单的代码。 – Brick

1

扩大到由TartanLlama接受的答案的评论,我是能够改善这种略带使得存在涉及少了一个模板参数。这导致了更简单的代码。

主要模板变成

template<typename X, typename Y> class C 

和专业化是

template<template<typename> class X, template<typename> class Y, typename T> class C<X<T>, Y<T>> 

这里的区别在于主模板不具有相对于附加模板参数T什么最初是由TartanLlama建议。

+0

是的,这绝对是一个改进:) – TartanLlama