功能模板专业化与模板

时间:2014-08-22 05:16:39

标签: c++ templates typetraits

我有一个功能模板,其中包含各种类型的专业化。但是,我想为指针定义模板特化。

为了澄清,这是现有代码的一部分:

template<typename T> inline T Get(int i);
/* ... */
template<> inline bool Get(int index) {
    //...
}
template<> inline std::string Get(int index) {
    //...
}

现在我计划添加一个在T是指向类的指针时执行的特化。我尝试添加以下行,但是这个(可以说是不完整的)变体似乎不被接受为第一个未定义模板的特化。 (Call is ambiguous);其他类型特征安排也没有在成功编制中结束。

template<typename T>
typename std::enable_if<std::is_pointer<T>::value, T>::type
inline Get(int index) {
    //...
}

我有什么选择?

1 个答案:

答案 0 :(得分:1)

您无法部分专门化功能模板,并且您的尝试实际上创建了一个不同的重载模板。没有所有SFINAE噪音的最干净的方法是将它包装在类可以部分特化的类模板中,然后编写一个函数模板,调度到适当的类模板专门化:

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

另一种方法是在enable_if为指针时用T显式禁用未定义​​的基本模板,但如果你想添加额外的重载,这很快会变得非常困难。