我认为模板专业化是完全独立的实体,可以拥有他们想要的任何东西。但是当我使返回类型的特殊化与原始模板的返回类型不同时,VC ++会给我一个错误。这真的是标准的吗?通过将函数体移动到静态类中,我可以轻松地解决它。
答案 0 :(得分:1)
没有函数模板部分特化,因为函数(和函数模板)的重载。但是,函数重载比模板特化更加有限,所以你通常做的是回归类模板特化:
template< typename R, typename T >
struct foo_impl {
static R foo(T)
{
// ...
return R(); // blah
}
};
template< typename T >
struct foo_impl<void,T> {
static void foo(T)
{
// ...
}
};
template< typename R, typename T >
R foo(T obj);
{
return foo_impl<R,T>::foo(obj); // fine even if R is void
}
答案 1 :(得分:0)
功能专业化很奇怪,几乎不存在。可以完全专门化一个函数,同时保留所有类型 - 即您提供现有函数的某些特化的自定义实现。你不能部分专门化模板化的功能。
你可能要做的就是过载,即:
template <typename T> T foo(T arg) { return T(); }
float foo(int arg) { return 1.f; }