- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
先举个例子:
template <class HashingSolution>
struct State : public HashingSolution {
void Update(int idx, int val) {
UpdateHash(idx, val);
}
int GetState(int idx) {
return ...;
}
};
struct DummyHashingSolution {
void UpdateHash(int idx, int val) {}
void RecalcHash() {}
};
struct MyHashingSolution {
void UpdateHash(int idx, int val) {
...
}
void RecalcHash() {
...
UpdateHash(idx, GetState(idx)); // Problem: no acces to GetState function, can't do recursive application of templates
...
}
};
在这个例子中,我可以将 MyHashingSolution 传递给 State 类,这样 State 就可以访问 HashingSolution 的方法,但 HashingSolution 不能调用 GetState。是否可以解决这个问题?
这是最深的循环。这里的虚函数降低了 25% 以上的性能。内联对我来说至关重要。
最佳答案
正如 jalf 在评论中建议的那样,您可能想使用 Curiously Recurring Template Pattern 的变体(CRTP)。也就是说,使MyHashingSolution
由派生类参数化的类模板:
template <typename D>
struct MyHashingSolution {
typedef D Derived;
void UpdateHash(int idx, int val) {
...
}
void RecalcHash() {
...
UpdateHash(idx, derived().GetState(idx));
...
}
private:
// Just for convenience
Derived& derived() { return *static_cast<Derived*>(this); }
};
在这种情况下,因为您想要派生的 State
class 也是一个模板,你需要采取稍微不寻常的步骤来声明 State
作为采用模板模板参数的类模板:
template <template <class T> class HashingSolution>
struct State : public HashingSolution<State<HashingSolution> > {
typedef HashingSolution<State<HashingSolution> > Parent;
void Update(int idx, int val) {
Parent::UpdateHash(idx, val); // g++ requires "Parent::"
}
int GetState(int idx) {
return ...;
}
};
关键在于,提供State
继承自 HashingSolution<State<HashingSolution> >
, Derived
是 HashingSolution<State<HashingSolution> >
的派生类所以 static_cast<Derived*>(this)
垂头丧气HashingSolution<State>::derived()
编译并正常工作。 (如果你搞砸了,而是从 State
派生了 HashingSolution<SomeOtherType>
,然后尝试调用 derived()
,编译器会报错,因为不满足 static_cast<>
的要求。)
然后声明具体的State
你想像这样使用的类:
typedef State<MyHashingSolution> MyState;
不幸的是,这个解决方案有副作用,您需要更改 DummyHashingSolution
(以及任何其他此类类型)忽略其一个模板参数的模板,以便使它们可用作模板模板参数。
关于c++ - 如何在 C++ 中编写内联相互抽象代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/673491/
我是一名优秀的程序员,十分优秀!