我有一个(免费的)函数模板,看起来像这样
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>*
.如果T
是foo<U>
,那么编译器将选择第二个重载,因为它更专门化,并且可以接受传递给它的参数 foo<U>*
在这种情况下。
关于c++ - 用模板专门化模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9542597/