你的设计看起来像
CRTP
自从
Child_Type1
继承由以下参数化的基类
儿童_类型1
本身,但不完全采用这种模式的原则,即只应将派生类传递给基类,而不应传递其他东西(如
T
和
Child_Type1<T>::Inner
在您的示例中)。
如果你完全遵循CRTP,你应该能够写:
template <class T>
class Child_Type1 : public Base<Child_Type1<T>> {};
然后尝试恢复
Base
你需要的类型,即。
T
和
儿童_类型1<T>:内部
请注意,您可以恢复
T
从
Child_Type1<T>
有一个小助手(另见
this
:
template <typename T>
struct get_T;
template <template <typename> class X,typename T>
struct get_T<X<T>> { using type = T; };
按照@Jarod42的答案并使用这个技巧,你可以得到这样的结果:
////////////////////////////////////////////////////////////////////////////////
// see https://stackoverflow.com/questions/78048504/how-to-write-a-template-specialization-of-a-type-trait-that-works-on-a-class-tem
template <typename T>
struct get_T;
template <template <typename> class X,typename T>
struct get_T<X<T>> { using type = T; };
////////////////////////////////////////////////////////////////////////////////
template <typename T>
struct Inner;
////////////////////////////////////////////////////////////////////////////////
template <class DERIVED>
class Base
{
public:
using U = typename get_T<DERIVED>::type;
using W = Inner<DERIVED>;
virtual void test(void) = 0;
};
////////////////////////////////////////////////////////////////////////////////
template <class T>
class Child_Type1 : public Base<Child_Type1<T>>
{
public:
Base<Child_Type1<T>>::W * var;
void test(void) override { var->some_variable; }
};
template <typename T> struct Inner<Child_Type1<T>> { T some_variable; };
////////////////////////////////////////////////////////////////////////////////
int main()
{
Child_Type1<int> c1 = Child_Type1<int>();
}