Brief:
我想确保派生类实现父 CRTP 类中的函数所需的成员函数。
Detail:
我有一些这样的代码
class Base
{
public:
class Params
{
public:
virtual ~Params() {}
};
virtual void myFunc( Params& p ) = 0;
};
template< typename T >
class CRTP : public Base
{
public:
virtual void myFunc( Base::Params& p ) override
{
typename T::Params& typedParams = dynamic_cast<typename T::Params&>( p );
static_cast<T*>( this )->myFunc( typeParams );
}
};
class Imp : public CRTP<Imp>
{
public:
class Params : public CRTP<Imp>::Params
{
public:
virtual ~Params() {}
int x, y, z;
};
virtual void myFunc( Imp::Params& p );
};
目的是我可以有多个Imp
儿童班级都在做不同的事情myFunc
并接受自己所需的参数。提供的接口Base
然后由只需要具有类型的指针/引用的更高级别函数使用Base::Params
and Base
。我的问题是确保任何Imp
提供专门的myFunc
。避免无限递归Imp
必须执行myFunc
.
我的第一次尝试是添加一个纯虚函数CRTP
virtual void myFunc( typename T::Params& p ) = 0;
但这不起作用Imp
尚未完全定义时CRTP
正在被定义。这个问题 https://stackoverflow.com/questions/23367221/ensure-derived-class-implements-static-method uses a static_assert
这让我想到对static_assert
within CRTP::myFunc
。除了我不确定非静态函数的静态断言中的表达式应该是什么。
- 我可以使用
static_assert
我需要什么?
- 这是确保派生类具有所需功能的最佳/最干净的方法吗?
- 我是否对我的类设计得意忘形并且有更好的做事方式?
Thanks.
为什么不为该函数使用不同的名称呢?那么每次推导都会出现编译错误CRTP
没有类和实现。考虑一下:
class Base
{
public:
class Params
{
public:
virtual ~Params() {}
};
virtual void myFunc( Params& p ) = 0;
};
template< typename T >
class CRTP : public Base
{
public:
virtual void myFunc( Base::Params& p ) final override
{
typename T::Params& typedParams = dynamic_cast<typename T::Params&>( p );
static_cast<const T*>( this )->myFuncImp( typedParams );
}
};
class Imp : public CRTP<Imp>
{
public:
class Params : public CRTP<Imp>::Params
{
public:
virtual ~Params() {}
int x, y, z;
};
};
int main(int argc, char** argv)
{
Imp imp;
}
编译失败,因为没有myFuncImp
由...提供Imp
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)