对多个功能使用相同的模板

时间:2014-11-12 19:45:14

标签: c++ templates

如果需要使用相同模板的多个函数,是否有办法在不每次声明模板的情况下声明和实现它们?

template <typename T>
T mymax (T a, T b);
template <typename T>
T mymin (T a, T b);
template <typename T>
T myfoo (T a, T b);

/********************************************/
template <typename T>
T mymax (T a, T b) {
    return (a > b ? a : b);
}

template <typename T>
T mymin (T a, T b) {
    return (a < b ? a : b);
}
template <typename T>
T myfoo (T a, T b) {
    return max(a,b)+min(a,b);
}

有没有办法只为一段代码写一行template <typename T>?看起来像:

template <typename T> {
  T mymax (T a, T b);
  T mymin (T a, T b);
  T myfoo (T a, T b);
}

(此代码不是合法语法,不会编译)

2 个答案:

答案 0 :(得分:1)

实现这样的事情的唯一方法是滥用结构和静态函数。不幸的是,您需要明确提及模板类型。

#include <iostream>

template<typename T>
struct my
{
  static T max(T a, T b) { return (a > b ? a : b); }
  static T min(T a, T b) { return (a < b ? a : b); }
  static T foo(T a, T b) { return max(a, b) + min(a, b); }
};

Live Demo.选择一个更好的班级名称。

我想不出任何“更好”的解决方案。只需写下template<typename T>即可。你会习惯的。它有一个目的,它并不像你想象的那么难看。

答案 1 :(得分:0)

有一个选项可以缩短代码,但它实际上与你要求的完全相反:你可以省略template<...> - 部分,但你可以简化其余部分:

// create a shortcut for the function type
template<typename T>
using my = T( T a, T b );

// declare several functions with an identical signature
template<typename T> my<T> mymin;
template<typename T> my<T> mymax;
template<typename T> my<T> myfoo;

请注意,这仅适用于声明,定义不会从中受益。

Live example