显式函数模板专业化

时间:2010-12-29 20:40:59

标签: c++11

我认为模板专业化是完全独立的实体,可以拥有他们想要的任何东西。但是当我使返回类型的特殊化与原始模板的返回类型不同时,VC ++会给我一个错误。这真的是标准的吗?通过将函数体移动到静态类中,我可以轻松地解决它。

2 个答案:

答案 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; }