我有一个函数模板,其中包含各种类型的特化。但是,我想为指针定义一个模板特化。
为了澄清,这是现有代码的一部分:
template<typename T> inline T Get(int i);
/* ... */
template<> inline bool Get(int index) {
//...
}
template<> inline std::string Get(int index) {
//...
}
现在我计划添加一个特化,当 T
是一个指向类的指针时执行。我试图添加以下几行,但是这个(可以说是不完整的)变体似乎没有被接受为第一个未定义模板的专门化。 (调用不明确
);其他类型特征安排也没有以成功的编译结束。
template<typename T>
typename std::enable_if<std::is_pointer<T>::value, T>::type
inline Get(int index) {
//...
}
我在这里有什么选择?
最佳答案
您不能部分特化函数模板,而您的尝试实际上创建了一个不同的重载模板。没有所有 SFINAE 噪音的最干净的方法是将它包装在一个类模板中,您可以部分特化,然后编写一个函数模板,该模板分派(dispatch)到适当的类模板特化:
template <class T>
struct do_get;
template <>
struct do_get<bool> {
static bool get(int i) { /*...*/ }
};
template <class T>
struct do_get<T*> {
static T* get(int i) { /*...*/ }
};
template <class T>
T Get(int i) { return do_get<T>::get(i); }
Demo .
当 T
是一个指针时,另一种方法是使用 enable_if
显式禁用未定义的基本模板,但如果您想添加额外的重载,这很快就会变得不堪重负。
关于c++ - 函数模板特化与模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25440000/