我有一个(免费)函数模板,如下所示
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(使用前将#替换为@)