gpt4 book ai didi

c++ - 偏特化和静态成员

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:59:43 24 4
gpt4 key购买 nike

我有以下内容:

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<> 生成的通用版本中,进行特化的各种方法,都没有用(根据我的尝试,我有几个不同的错误消息,所以在这里发布它们可能不是很有帮助)。那么,如何部分特化静态成员函数,使特化函数覆盖泛型类中的函数?

最佳答案

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

关于c++ - 偏特化和静态成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47080216/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com