用模板专门化一个模板

2023-12-09

我有一个(免费)函数模板,如下所示

template <typename T>
T get();

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

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

你正在做的事情叫做partial函数模板的专门化。但partial不允许函数模板的专门化。函数模板的重载是允许的,但在这种情况下也是不可能的,因为函数只有返回类型,并且不允许对返回类型进行重载。

所以解决方案是这样的:

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>*. If T is foo<U>,那么编译器将选择第二个重载,因为它是more专门化,并且可以接受传递给它的参数,即foo<U>*在这种情况下。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

用模板专门化一个模板 的相关文章