我在Curiously Recurring Template Pattern上阅读的所有材料似乎都是一层继承,即Base和Derived : Base<Derived>.如果我想更进一步怎么办?
#include <iostream>
using std::cout;
template<typename LowestDerivedClass> class A {
public:
LowestDerivedClass& get() { return *static_cast<LowestDerivedClass*>(this); }
void print() { cout << "A\n"; }
};
template<typename LowestDerivedClass> class B : public A<LowestDerivedClass> {
public: void print() { cout << "B\n"; }
};
class C : public B<C> {
public: void print() { cout << "C\n"; }
};
int main()
{
C c;
c.get().print();
// B b; // Intentionally bad syntax,
// …Run Code Online (Sandbox Code Playgroud) 使用CRTP有时我会编写如下代码:
// this was written first
struct Foo : Base<Foo, ...>
{
...
};
// this was copy-pasted from Foo some days later
struct Bar : Base<Foo, ...>
{
...
};
Run Code Online (Sandbox Code Playgroud)
并且很难理解出现了什么问题,直到我在调试器中跟踪代码并看到Bar的成员未被使用Base.
如何在编译时显示此错误?
(我使用MSVC2010,所以我可以使用一些C++ 0x功能和MSVC语言扩展)