作者热门文章
- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我有两个类 A
和 B
,如下所示,它们都实现了一个方法 g
(在两者中重复相同的脚本),这取决于模板化方法 f
。如何避免在 A
和 B
类的 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
并简化 A
和B
如下:
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/
我有一个特别的问题想要解决,我不确定是否可行,因为我找不到任何信息或正在完成的示例。基本上,我有: class ParentObject {}; class DerivedObject : publi
在我们的项目中,我们配置了虚 URL,以便用户可以在地址栏中输入虚 URL,这会将他们重定向到原始 URL。 例如: 如果用户输入'http://www.abc.com/partner ',它会将它们
我是一名优秀的程序员,十分优秀!