CRTP、专业化和重构:
template<typename D, bool A>
struct foo_A
{
public:
D const* self() const {
static_assert( std::is_base_of<foo_A<D,A>, D>::value, "CRTP failure" );
return static_cast<D const*>(this);
}
D* self() {
static_assert( std::is_base_of<foo_A<D,A>, D>::value, "CRTP failure" );
return static_cast<D*>(this);
}
void f3() {
return self()->v2;
}
};
template<typename D>
struct foo_A<D, true>
{
private:
int v2;
public:
D const* self() const {
static_assert( std::is_base_of<foo_A<D,A>, D>::value, "CRTP failure" );
return static_cast<D const*>(this);
}
D* self() {
static_assert( std::is_base_of<foo_A<D,A>, D>::value, "CRTP failure" );
return static_cast<D*>(this);
}
void f3() {
return self()->v1;
}
};
template<typename D, bool B> struct foo_B {};
template<typename D>
struct foo_B<D,true> {
void f2() {}
};
template<bool A, bool B>
class foo:
foo_A<foo<A,B>,A>,
foo_B<foo<A,B>,B>
{
private:
int v1;
public:
void f1() {}
};
CRTP 让您的帮助类可以静态编译时访问您的类的内容,甚至是其他帮助类。
辅助类的专业化以及适当的重构为您提供了不会呈指数增长的良好条件。您甚至可以在派生类中执行一些通用逻辑,并在每个特化中访问这些值。