如果需要使用相同模板的多个函数,是否有办法在不每次声明模板的情况下声明和实现它们?
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);
}
(此代码不是合法语法,不会编译)
答案 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;
请注意,这仅适用于声明,定义不会从中受益。