gpt4 book ai didi

c++ - 确保从父 CRTP 类派生的类实现功能

转载 作者:可可西里 更新时间:2023-11-01 16:09:53 26 4
gpt4 key购买 nike

简介:

我想确保派生类实现父 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 ) 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 提供的接口(interface)随后由更高级别的函数使用,这些函数只需要具有 Base::ParamsBase 类型的指针/引用.我的问题是确保任何 Imp 都提供专门的 myFunc。为了避免无限递归,Imp 必须实现 myFunc

我的第一个尝试是向 CRTP 添加一个纯虚函数

virtual void myFunc( typename T::Params& p ) = 0;

但这不起作用,因为在定义 CRTPImp 尚未完全定义。 This question使用 static_assert 这让我想到了对 CRTP::myFunc 中的 static_assert 做同样的事情。除了我不确定非静态函数的静态断言中的表达式应该是什么。

  1. 我可以使用 static_assert 来满足我的需要吗?
  2. 这是确保派生类具有所需功能的最好/最干净的方法吗?
  3. 我是否对我的类(class)设计着了迷并且有更好的做事方式?

谢谢。

最佳答案

为什么不为函数使用不同的名称?然后,对于没有实现的 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;
}

编译失败,因为 Imp 没有提供 myFuncImp

关于c++ - 确保从父 CRTP 类派生的类实现功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32354501/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com