部分专业化和静态成员

时间:2017-11-02 16:29:59

标签: c++

我有以下内容:

template<typename T, bool is_derived = false>
struct A
{ 
    T v_;

    static const char* getMehStatic();
    virtual const char* getMeh() const { return getMehStatic(); }
};

template<typename T>
struct A<std::vector<T>> : public A<std::vector<T>, true>
{
    static const char* getMehStatic();
};

template<typename T>
const char* A<std::vector<T>>::getMehStatic() { return "vector"; }

int main()
{
    A<std::vector<int>> a;

    std::cout << a.getMeh();
}

当我编译它时,链接器抱怨它找不到getMehStatic();这是因为它寻找泛型类型。换句话说,它似乎跳过了我尝试提供部分专业化A<std::vector<T>>的实现。

我从泛型版本派生我的专业类,使用默认参数选择正确的类,否则专门的类将从自身派生。

我尝试了各种各样的事情 - 阻止使用getMehStatic()生成通用版本中的enable_if<>,各种方式进行专业化,没有工作(我有几个不同的错误)消息取决于我尝试的内容,所以在这里发布它们可能不是很有帮助)。那么,我如何部分地专门化静态成员函数,使专用函数覆盖泛型类中的函数?

2 个答案:

答案 0 :(得分:2)

缺少A<std::vector<T>, true>::getMehStatic()的定义。 不幸的是,你不能局部专门化它。您可以提供通用定义:

template<typename T, bool is_derived>
const char* A<T, is_derived>::getMehStatic() { return "generic"; }

Demo

但由于A<std::vector<T>>未覆盖getMeh(),因此它是调用的通用方法。

CRTP确实可以解决这个问题:

template<typename T, typename Derived>
struct A
{ 
    T v_;

    const char* getMeh() const { return Derived::getMehStatic(); }
};

struct B : A<std::vector<int>, B>
{
    static const char* getMehStatic() { return "vector"; }
};

Demo

答案 1 :(得分:1)

  

那么,我如何部分地专门化静态成员函数,使专用函数覆盖泛型类中的函数?

通过CRTP,类似

template<typename T, typename Derived = void>
struct A
{ 
    T v_;

    static const char* getMehStatic();

    virtual const char* getMeh() const {
      if constexpr( std::is_same_v<Derived,void> )
        return getMehStatic();
      else
        return Derived::getMehStatic();
    }
};

template<typename T>
struct A<std::vector<T>> : public A<std::vector<T>, A<std::vector<T>> >
{
    static const char* getMehStatic();
};

template<typename T, typename Derived>
const char* A<T,Derived>::getMehStatic() { return "generic"; }

template<typename T>
const char* A<std::vector<T>>::getMehStatic() { return "vector"; }