2013-12-09 24 views
6

有时我想写两个模板,如:为什么C++不允许模板重载?

template <typename Type1> 
class A{ 
    ... 
}; 

template <typename Type1, typename Type2> 
class A{ 
    ... 
}; 

但似乎是不合法的有两个模板共享相同的名称,但有不同的参数。我必须将它命名为A_1A_2。我认为这可能是有用的,如果我可以做到这一点,特别是在执行Functors时。

为什么C++不允许这样做?在某些情况下难以实施还是模棱两可?这将在更高版本的C++上得到支持吗?

+7

出于同样的原因,C++不允许具有相同名称的两个类。 – Jack

+2

使用C++ 11可变参数模板http://en.wikipedia.org/wiki/Variadic_template – higuaro

+0

您可以使用默认模板参数来近似它。 –

回答

12

这是非常有用的,但正如你所说,C++不允许你直接这样做。但是,你可以用部分专业化做几乎相同的事情。

如果使用可变参数模板在C++ 11,你可以做以下这是特别容易:

template <typename... T> 
struct A; // Declared but not defined 

template <typename T, typename U> 
struct A<T, U> 
{ 
    // definition of the two-parameter case 
}; 

template <typename T> 
struct A<T> 
{ 
    // definition of the one-parameter case 
}; 

实际上,这可以让你有A<T, U>A<T>作为完全独立的类型。尝试实例化A以及更多模板参数将导致编译错误,因为一般情况下未定义(如果需要,可以使用static_assert给出一个很好的错误消息)。

使用默认模板参数(设置为空虚拟结构或void)可以在C++ 03中实现类似的功能,但是C++ 11版本更好。

0

一个简单的(可能的)解决方案,将有第二个模板参数的默认值。 这样您只能实现一个模板,并且可以使用一个模板参数调用它,并使用默认的第二个模板,或者覆盖默认值。