部分模板专用化可能不适用于函数,但重载不是一回事吗?
Partial template specialization may not work for functions, but isn't overloading the same thing?
函数
缺乏"部分模板专用化"真的是一个缺点吗?当我定义一个模板,以及一个重载作为专用化时,它似乎总是有效。
template<typename T>
static T Func(T a) { std::cout << "a"; return a; }
static long Func(long a) { std::cout << "b"; return a; }
例如,它在推理方面与Func<long>
并不冲突。 Func(22l);
调用正确的函数,没有歧义。
这不和函数的模板专用化一样好吗?公开此类功能是否存在我需要注意的陷阱?
编辑:我看到一个区别是Func<long>
不可能调用重载,所以这里需要推理......绝对是一个潜在的混淆来源,特别是如果从另一个模板引用它。
另一个编辑:正如所指出的,这是一个完整的专业化,而不是部分专业化。幸运的是,它似乎仍然适用于部分:
template<typename T, typename U>
static U Func(T a, U b) { std::cout << "a"; return a; }
template<typename T>
static long Func(T a, long b) { std::cout << "b"; return a; }
Func<long>(12, 22); // invokes template
Func<long>(12, 22l); // invokes "specialization"
考虑
template<class R, class T>
R convert(const T&);
假设我们想为convert<void>(/*something*/)
做一些特别的事情(即,R
void
的情况)。您无法通过简单的重载或完全专业化来做到这一点。(通常的技巧是委托给帮助程序类模板的静态成员函数,该函数可以部分专用化。
相关文章:
- 如何为非常量和常量重载实现一次成员函数?
- 为什么对于gcc来说,"UNIX"和"unix"宏不是一回事?
- 一种优雅或至少可行的方法,用于使用和接受具有重载方法和运算符的不同大小的文字数组常量
- 重载调用是不明确的:一对内联映射作为构造函数参数
- 一种类型特征,标识哪个类提供通过重载解析选择的函数
- 当我尝试编译程序时,我遇到了一堆错误,例如:'std::max':找不到匹配的重载函数
- 使用模板重载现有函数是否是一种不好的做法
- 如何在不与标准库运算符冲突的情况下为一组相关类重载运算符?
- 如何最好地重载运算符 < > <= >= 但只写一两个比较函数?
- 重载输入/输出运算符,为什么它以这种方式工作而不是以另一种方式工作
- 重载函数时使用临时对象作为参数是一种好的做法吗
- C++中的"derived"与Java中的"extended"是一回事吗?
- 部分模板专用化可能不适用于函数,但重载不是一回事吗?
- 重载一组类的加号运算符
- 抽象类与基类是一回事吗?
- const 和 constexpr 最终会是一回事吗?
- 如何重载一组对象的运算符
- Std::hash_set和Std::unordered_set是一回事吗?
- 如何重载一组对的比较操作符?
- 抽象方法和纯虚拟函数是一回事吗