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

2024-04-06

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。除了我不确定非静态函数的静态断言中的表达式应该是什么。

  1. 我可以使用static_assert我需要什么?
  2. 这是确保派生类具有所需功能的最佳/最干净的方法吗?
  3. 我是否对我的类设计得意忘形并且有更好的做事方式?

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(使用前将#替换为@)

确保从父 CRTP 类派生的类实现功能 的相关文章

随机推荐

  • Android 拖放问题不显示

    我正在开发一个拖放应用程序 一切正常 但我看到了一个问题 我有 3 个 ImageView 其中两个是可拖动对象 另一个是放置目标 每次我将物体扔到除放置目标之外的任何位置时 它都会完全消失 下面是我使用的代码 ImageView iv1
  • s3 临时签名 URL 中缺少对象的自定义 404 页面

    我正在为 Amazon S3 中的一些私人信息生成一些签名 URL 如果签名链接已过期或对象不存在 则会报告 XML 错误以及 404 错误 或 403 禁止 是否可以将签名链接 404 重定向到自定义错误页面 这似乎与 S3 静态网站设置
  • VS2010没有断点时调试器停止

    我最近更改了调试器中的一个选项 我认为这就是导致此问题的原因 但我似乎无法 撤消 它 我谷歌 所有命中都返回相反的 为什么调试器 not在断点处停止 无论如何 有人可以透露一些信息吗 编辑 当我在调试模式下按 f5 时 每次 它进入 Pro
  • Logstash创建管道但未创建索引

    我正在尝试使用 json 文件在 elasticsearch 云上创建索引 我已经创建了如下所示的配置 input file path gt root leads json start position gt beginning ignor
  • 在WPF中画一个十字

    我有一个 WPF 控件 I need to have in background a cross like this After that I d be able to add other controls over my crossed
  • 对数组元素(带有数字的字符串)进行排序,自然排序

    我有一个像这样的数组 IL0 Foo PI0 Bar IL10 Baz IL3 Bob says hello 并且需要对其进行排序 使其看起来像 IL0 Foo IL3 Bob says hello IL10 Baz PI0 Bar 我尝试
  • PHP 循环动态变量

    我正在尝试创建一个动态变量 我有一个循环 我希望它循环记录并为每个记录创建一个变量 我的代码 ct 1 foreach record as rec var ct rec Name ct ct 1 echo var1 当我尝试使用上面的代码时
  • 将 ToolBar 添加到 UITableView 的正确方法是什么?

    我正在编写一个基于导航的 iPhone 应用程序 我希望将 UIToolBar 停靠在屏幕底部 并在工具栏和导航栏之间滚动 UITableView 我见过几个论坛 其中有人建议处理此视图的视图控制器应该是标准 UIViewControlle
  • 车道检测器分隔线 C ++ 与 OpenCV

    现在我一直在用OpenCV进行图像分析 我想做的是识别车道分割线 我所做的如下 1 I receive a image 2 Then transform it to grayscale 3 I apply the GaussianBlur
  • 将 CodeMirror 与 Angular2 集成(打字稿)

    我目前正在致力于将 CodeMirror 编辑器添加到项目中 更准确地说是 Angular2 项目 但我做起来有困难 我的编辑器的实例化似乎无法正常工作 我的代码如下 编辑器 组件 ts import Component from angu
  • C++ 交换值的最有效方法

    我想知道在 C 中交换整数的最有效的操作方式是什么 为什么 是这样的 int a b a a b b a b a a b 比使用临时的更有效 还有其他更有效的方法吗 不只是要求其他方法来交换整数 以及为什么它们会更有效 赋值总是比进行算术运
  • 调整 UILabel 大小以适应自动换行

    这是 iPhone 应用程序的一部分 但通常应该适用于用 objC 编写的 Cocoa 我有一个 UILabel 保存各种数量的文本 从单个字符到几个句子 文本应始终以适合 UILabel 中所有文本的尽可能大的字体显示 最大行数设置为 4
  • List 复杂排序

    我有一个List
  • 使用 gradle 创建一个包含 web 应用程序中的类的 JAR

    IE 有没有等价的archiveClasses maven war plugin 的 true 设置 https maven apache org plugins maven war plugin faq html attached对于 W
  • 如何为谷歌云存储服务帐户进行密钥轮换?

    我已经编写了用于访问 GCS 存储桶的代码 以通过 java 中的 API 存储文件 该 API 需要 JSON 凭证文件 我已经从 google 控制台创建了该 JSON 文件 我需要每 90 天自动执行一次 JSON 文件或密钥轮换 如
  • ModalBottomSheetLayout 在返回导航上闪烁 (Jetpack Compose)

    我在用着ModalBottomSheetLayout import androidx compose material ModalBottomSheetLayout 并在模式表布局中有一些项目 当我按下一个项目时 它会导航到下一个屏幕 但是
  • 使用循环使用 Dataframe Pandas 创建 Excel 工作表

    我正在开发这个函数 它可以抓取网站上的 Fantasy Football 信息并将其写入 Excel 文件 最终 我希望在 Excel 工作簿的单独工作表中包含每周的信息 下面发布的代码可以完美运行 直到我想将其写入 Excel 工作簿 该
  • 使用 Nginx 为 Angular2 CLI 构建的应用程序提供服务会抛出 404、403

    我使用 Angular CLI 创建一个测试应用程序并使用 Nginx 为其提供服务 得到 404 或 403 我猜这是我的 Nginx 配置的问题 但为了额外确定 我已经提供了达到这一点所执行的所有步骤 这些是我遵循的步骤 安装的角度 c
  • 如何使用scala从apache Spark中的kafka主题读取json数据

    我是新的 Spark 您能否让我知道如何使用 scala 从 apache Spark 中的 kafka 主题读取 json 数据 Thanks 最简单的方法是使用 Spark 附带的 DataFrame 抽象 val sqlContext
  • 确保从父 CRTP 类派生的类实现功能

    Brief 我想确保派生类实现父 CRTP 类中的函数所需的成员函数 Detail 我有一些这样的代码 class Base public class Params public virtual Params virtual void my