gpt4 book ai didi

c++ - 当我因为模板不能使用纯虚函数时简化类设计

转载 作者:搜寻专家 更新时间:2023-10-31 01:35:19 24 4
gpt4 key购买 nike

我有两个类 AB,如下所示,它们都实现了一个方法 g(在两者中重复相同的脚本),这取决于模板化方法 f。如何避免在 AB 类的 g 方法中重复代码?

class A {
public:
template<typename T>
void f() {}

void g() {
f<int>();
f<double>();
// etc.
}
};

class B {
public:
template<typename T>
void f() {}

void g() {
//The same scipt as that of A::g()
f<int>();
f<double>();
// etc.
}
};

如果 f 没有模板化,那么我会将 g 移动到基类,定义一个纯虚函数 f 并简化 AB如下:

class Base {
public:
virtual Base() = default;
virtual void f() = 0;
void g() { f(); }
};

class A : public Base {
public:
void f() {}
};

class B : public Base {
public:
void f() {}
};

但是,我想知道当 f 被模板化时是否有类似的方法。

最佳答案

CRTP 在这里工作正常。
它遵循一个最小的工作示例:

template<typename D>
class X {
public:
void g() {
D &d = static_cast<D&>(*this);
d.template f<int>();
d.template f<double>();
// etc.
}
};

class A: public X<A> {
public:
template<typename T>
void f() { }
};

class B: public X<B> {
public:
template<typename T>
void f() { }
};

int main() {
B b{};
b.g();
}

只要 f 在您的派生类中是公共(public)的,它就是一个很好的解决方案。
否则,您必须在这些类中添加这些丑陋的 friend class 语句:

class A: public X<A> {
private:
friend class X<A>;

template<typename T>
void f() { }
};

class B: public X<B> {
private:
friend class X<A>;

template<typename T>
void f() { }
};

关于c++ - 当我因为模板不能使用纯虚函数时简化类设计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37627831/

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