c++ - 用模板专门化模板

标签 c++ templates specialization

我有一个(免费的)函数模板,看起来像这样

template <typename T>
T get();

我现在想将这个函数专门用于一个类,它本身就是一个模板。但是我的编译器不想编译它,我现在问这是否可能以及我如何实现它。仅出于想法,代码可能如下所示:(不编译)

template <>
template <typename T>
foo_type<T> get<foo_type<T>>()

最佳答案

您正在做的是函数模板的部分特化。但是函数模板的部分特化是不允许的。函数模板的重载是允许的,但在这种情况下,也是不可能的,因为函数只有返回类型,并且不允许对返回类型进行重载。

所以解决方案是这样的:

namespace details
{
     template <typename T>
     struct worker
     {
         static T get();
     };

     template <typename T> //partial specialization of class is allowed
     struct worker<foo<T>>
     {
         static foo<T> get();
     };

}

template <typename T>
T get()
{
  return details::worker<T>::get();
}

如果您将重载定义为采用一个参数以使重载有效,您也可以使用重载:

namespace details
{
     template <typename T>
     static T get(T*); 

     template <typename T> 
     static foo<T> get(foo<T>*); //now the overload is valid

}

template <typename T>
T get()
{
  return details::get<T>(static_cast<T*>(0));
}

注意参数 static_cast<T*>(0)用于帮助编译器选择正确的重载。如果T不是foo<U> , 那么第一个重载将被选择为传递给它的参数类型将是 T*而不是 foo<U>* .如果Tfoo<U> ,那么编译器将选择第二个重载,因为它专门化,并且可以接受传递给它的参数 foo<U>*在这种情况下。

关于c++ - 用模板专门化模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9542597/

相关文章:

c++ - 属性警告未使用结果相当于 Visual C

c++ - 使用 boost asio 时如何获取 UDP 远程端点?

c++ - 帮助类型特征

c++ - 我可以检查哪些函数模板至少实例化过一次吗?

javascript - 如何在 Handlebars 模板中使用对象的括号表示法?

c++ - 在头文件中使用enable_if对模板进行特化

c++ - 调用专门的 ostream 运算符

c++ - 如何返回类中私有(private)成员字符串的值

android - fatal error : android_native_app_glue. h:没有这样的文件或目录

c++ - 为什么模板只能在头文件中实现?