两个仅与模板参数不同的类

时间:2015-04-29 09:59:00

标签: c++ templates

是否可以创建两个具有相同名称的模板类,只有模板参数的数量不同?例如,

template<typename T>
struct Tuple {
    T Item;
};

template<typename T1, typename T2>
struct Tuple {
    T1 Item1;
    T2 Item2;
};

3 个答案:

答案 0 :(得分:2)

不是您使用的语法,但有其他解决方案:

选项#1:

(C ++ 03)

template <typename T1, typename T2 = void>
struct Tuple
{
    T1 Item1;
    T2 Item2;
};

template <typename T1>
struct Tuple<T1, void>
{
    T1 Item;
};

DEMO 1

选项#2:

(C ++ 11)

template <typename...>
struct Tuple;

template <typename T1>
struct Tuple<T1>
{
    T1 Item;
};

template <typename T1, typename T2>
struct Tuple<T1, T2>
{
    T1 Item1;
    T2 Item2;
};

DEMO 2

答案 1 :(得分:1)

不,你不能。您正在寻找的是class templates overloading之类的东西。根据{{​​1}}:

  

在C ++中,有类模板和函数模板。这两个   各种模板不会以完全相同的方式工作   重载明显不同:普通的旧C ++课程没有   超载,所以类模板也不会过载。另一方面,   具有相同名称的普通旧C ++函数做过载,所以函数   模板也允许重载。这很自然。

基本上,您可以通过Exceptional C++ Style Chapter 7实现功能。如:

partially specialization

然后

template<typename T1, typename T2 = T1>
struct Tuple {
    T1 Item1;
    T2 Item2;
};
template<typename T>
struct Tuple<T, T> {
    T Item;
};

DEMO

答案 2 :(得分:1)

至少,不可能这样。

但你应该考虑可变参数模板......

这是一个基本的元组示例(被盗形式http://eli.thegreenplace.net/2014/variadic-templates-in-c/):

template <class... Ts> struct tuple {};

template <class T, class... Ts>
struct tuple<T, Ts...> : tuple<Ts...> {
  tuple(T t, Ts... ts) : tuple<Ts...>(ts...), tail(t) {}

  T tail;
};