C++ 部分专门化与静态成员

C++ 部分专门化与静态成员,c++,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>

我有以下资料:

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();
}
模板
结构A
{ 
T v_;
静态常量char*getMehStatic();
虚拟常量char*getMeh()常量{return getMehStatic();}
};
模板
结构A:公共A
{
静态常量char*getMehStatic();
};
模板
常量char*A::getMehStatic(){返回“向量”;}
int main()
{
A A;
标准::cout
那么,如何对静态成员函数进行部分专门化,使专门化的函数覆盖泛型类中的函数

通过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"; }
模板
结构A
{ 
T v_;
静态常量char*getMehStatic();
虚拟常量char*getMeh()常量{
如果constexpr(std::is_same_v)
返回getMehStatic();
其他的
返回派生::getMehStatic();
}
};
模板
结构A:公共A
{
静态常量char*getMehStatic();
};
模板
const char*A::getMehStatic(){返回“generic”;}
模板
常量char*A::getMehStatic(){返回“向量”;}
缺少
A::getMehStatic()
的定义。 很遗憾,您无法对其进行局部专门化。您可以提供泛型定义:

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

是的,这是另一种说法-我的问题是如何让它使用专用版本?好的,谢谢-我希望我不必这样做,但我想(仔细考虑后)拥有CRTP参数并不比现在拥有布尔参数更糟糕。您需要提供
a::getMehStatic()
。继承的目的是什么:
A:public A
?@Jarod42:我试过了,然后得到了“错误C3860:类模板名称后面的模板参数列表必须按照模板参数列表中使用的顺序列出参数”(VS 2017),或“20::20:58:错误:不完整类型“struct A”的使用无效”(g++),这两个我都不明白。@Jarod42使用泛型版本提供的功能;在我的实际代码中,它有一堆成员和函数。是的,我可以重构,这样我就不需要这样做,这样我就不会有这个问题,但它在完全专业化和非静态成员函数中工作得很好,所以我我认为在本例中也应该有一些方法…好的,谢谢-你能解释一下为什么这里不可能进行部分专门化,但完全是这样吗?我希望这会起作用:模板模板内联const char*A::getMehStatic(){return“-“;}但这似乎是非法的。
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"; }
};