部分专用化和静态成员

Partial specialization and static member

本文关键字:静态成员 专用      更新时间:2023-10-16

>我有以下内容:

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>>实现的尝试。

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

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

缺少A<std::vector<T>, true>::getMehStatic()的定义。不幸的是,您无法对其进行部分专业化。您可以提供通用定义:

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

演示

但是由于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"; }
};

演示

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

通过 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"; }