带有 typedef 的可变 CRTP
variadic CRTP with a typedef
我正在试验一些使用可变 CRTP 的代码来创建混入。我希望根据用户选择的类型对 mixin 进行模板化。我基本上试过这个:
template <class Base>
class Feature1 {
public:
// why doesn't this work?!
// using value_type = typename Base::value_type;
public:
void extraMethod1() {
auto base = static_cast<Base&>(*this);
base.basicMethod();
}
};
template <class T, template <typename> class ... Skills>
class X : public Skills<X<T, Skills...>>... {
public:
using value_type = T;
public:
void basicMethod() {
}
};
using X1 = X<int, Feature1>;
所以我的问题是,如果 Base::basicMethod
可以访问,为什么我会收到 Base::value_type
的错误消息?
错误是:
X.cpp:6:37: error: no type named 'value_type' in 'X<int, Feature1>'
using value_type = typename Base::value_type;
~~~~~~~~~~~~~~~^~~~~~~~~~
X.cpp:15:19: note: in instantiation of template class 'Feature1<X<int, Feature1> >' requested here
class X : public Skills<X<T, Skills...>>... {
clang 和 g++ 都给出类似的错误,c++ 的版本是 14 或 17(因为这只是一个实验)。
对于 CRTP,Base
class 在 Feature1
定义中仍然不完整。
因此您不能使用其中定义的别名。
作为解决方法,您可以创建特征。
template <typename T>
struct MyTrait;
template <class Base>
class Feature1 {
public:
using value_type = typename MyTrait<Base>::type;
public:
void extraMethod1() {
auto base = static_cast<Base&>(*this);
base.basicMethod();
}
};
template <class T, template <typename> class ... Skills>
class X;
template <class T, template <typename> class ... Skills>
struct MyTrait<X<T, Skills>>
{
using type = T;
};
template <class T, template <typename> class ... Skills>
class X : public Skills<X<T, Skills...>>... {
public:
using value_type = typename MyTrait<X>::type;
public:
void basicMethod() {}
};
我正在试验一些使用可变 CRTP 的代码来创建混入。我希望根据用户选择的类型对 mixin 进行模板化。我基本上试过这个:
template <class Base>
class Feature1 {
public:
// why doesn't this work?!
// using value_type = typename Base::value_type;
public:
void extraMethod1() {
auto base = static_cast<Base&>(*this);
base.basicMethod();
}
};
template <class T, template <typename> class ... Skills>
class X : public Skills<X<T, Skills...>>... {
public:
using value_type = T;
public:
void basicMethod() {
}
};
using X1 = X<int, Feature1>;
所以我的问题是,如果 Base::basicMethod
可以访问,为什么我会收到 Base::value_type
的错误消息?
错误是:
X.cpp:6:37: error: no type named 'value_type' in 'X<int, Feature1>'
using value_type = typename Base::value_type;
~~~~~~~~~~~~~~~^~~~~~~~~~
X.cpp:15:19: note: in instantiation of template class 'Feature1<X<int, Feature1> >' requested here
class X : public Skills<X<T, Skills...>>... {
clang 和 g++ 都给出类似的错误,c++ 的版本是 14 或 17(因为这只是一个实验)。
对于 CRTP,Base
class 在 Feature1
定义中仍然不完整。
因此您不能使用其中定义的别名。
作为解决方法,您可以创建特征。
template <typename T>
struct MyTrait;
template <class Base>
class Feature1 {
public:
using value_type = typename MyTrait<Base>::type;
public:
void extraMethod1() {
auto base = static_cast<Base&>(*this);
base.basicMethod();
}
};
template <class T, template <typename> class ... Skills>
class X;
template <class T, template <typename> class ... Skills>
struct MyTrait<X<T, Skills>>
{
using type = T;
};
template <class T, template <typename> class ... Skills>
class X : public Skills<X<T, Skills...>>... {
public:
using value_type = typename MyTrait<X>::type;
public:
void basicMethod() {}
};