继承模板方法

2023-11-25

我有一个类似于以下内容的课程:

class SomeClass
{
    public:
        template<typename... Args>
        void doSomething(Args && ... args);

        //... other methods etc.
};

然而,我真正想要的是有两种不同的SomeClass。理想情况下,我能够从一个通用接口派生出来SomeOtherClass,但我需要有一个不同的实现doSomething并且模板化方法不能是虚拟的。我可以创建一个模板类,但是每个采用其中一个(并且有很多)的方法本身都必须是模板等。

我能想到的最好的办法就是实现这两种类型doSomething在基类中,并让该方法调用虚拟方法来确定在运行时使用哪个方法。

有更好的解决方案吗?

进一步解释

我有很多与此类似的方法:

void foo(SomeClass * obj);

foo calls obj->doSomething这一切都很好,但是我后来意识到我需要一种不同的SomeClass但希望它能够使用这些相同的方法,例如:

class SomeClass
{
    public:
        // This won't work
        template<typename... Args>
        virtual void doSomething(Args && ... args) = 0;

        // ... other common methods
};

class TheFirstType
{
    public:
        template<typename... Args>
        void doSomething(Args && ... args);

        // ... other specific methods
};

class TheSecondType
{
    public:
        template<typename... Args>
        void doSomething(Args && ... args);

        // ... other specific methods
};

如果合法的话,上面的方法是理想的,但是虚拟方法不能模板化。到目前为止,我已经通过只绕过了这个限制doSomething在基类中定义,但同时具有以下实现TheFirstType and TheSecondType由 if 语句分隔,该语句检查实例实际是什么类型:

template<typename... Args>
void SomeClass::doSomething(Args && ... args)
{
    if (this->type() == FIRST_TYPE) {
        // ... the implementation that should rightfully be part of TheFirstType
    } else if (this->type() == SECOND_TYPE) {
        // ... the implementation that should be part of TheSecondType
    }
}

然而,这看起来很混乱,所以我想知道是否有更好的方法。


我认为@stijn的答案是正确的;您有一个理想的案例CRTP。您可以选择据此改变您的逻辑。

template<class T>
class SomeClass
{
public:
  template<typename... Args>
  void doSomething(Args && ... args)
  {
    static_cast<T*>(this)->doSomething(...);
  }
  //other method can be virtual
  virtual void foo ()
  {
    doSomething(...);
    // ... other code;
  }
};

现在只需继承这些class到您的其他孩子班级:

class TheFirstType : SomeClass<TheFirstType>
{
public:
  template<typename... Args>
  void doSomething(Args && ... args) { ... }

  virtual void foo ()
  {
  }
};   // do same for TheSecondType.

你完成了。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

继承模板方法 的相关文章

  • 属性对象什么时候创建?

    由于属性实际上只是附加到程序集的元数据 这是否意味着属性对象仅根据请求创建 例如当您调用 GetCustomAttributes 时 或者它们是在创建对象时创建的 或者 前两个的组合 在由于 CLR 的属性扫描而创建对象时创建 从 CLR
  • 为什么 POSIX 允许在只读模式下超出现有文件结尾 (fseek) 进行搜索

    为什么寻找文件结尾很有用 为什么 POSIX 让我们像示例中那样在以只读方式打开的文件中进行查找 c http en cppreference com w c io fseek http en cppreference com w c io
  • HttpClient 像浏览器一样请求

    当我通过 HttpClient 类调用网站 www livescore com 时 我总是收到错误 500 可能服务器阻止了来自 HttpClient 的请求 1 还有其他方法可以从网页获取html吗 2 如何设置标题来获取html内容 当
  • 为什么模板不能位于外部“C”块内?

    这是一个后续问题一个答案 https stackoverflow com questions 4866433 is it possible to typedef a pointer to extern c function type wit
  • 在 ASP.Net Core 2.0 中导出到 Excel

    我曾经使用下面的代码在 ASP NET MVC 中将数据导出到 Excel Response AppendHeader content disposition attachment filename ExportedHtml xls Res
  • A* 之间的差异 pA = 新 A;和 A* pA = 新 A();

    在 C 中 以下两个动态对象创建之间的确切区别是什么 A pA new A A pA new A 我做了一些测试 但似乎在这两种情况下 都调用了默认构造函数 并且仅调用了它 我正在寻找性能方面的任何差异 Thanks If A是 POD 类
  • 我的 strlcpy 版本

    海湾合作委员会 4 4 4 c89 我的程序做了很多字符串处理 我不想使用 strncpy 因为它不会终止 我不能使用 strlcpy 因为它不可移植 只是几个问题 我怎样才能让我的函数正常运行 以确保它完全安全稳定 单元测试 这对于生产来
  • Windows 10 中 Qt 桌面应用程序的缩放不当

    我正在为 Windows 10 编写一个简单的 Qt Widgets Gui 应用程序 我使用的是 Qt 5 6 0 beta 版本 我遇到的问题是它根本无法缩放到我的 Surfacebook 的屏幕上 这有点难以判断 因为 SO 缩放了图
  • 更改窗口的内容 (WPF)

    我创建了一个简单的 WPF 应用程序 它有两个 Windows 用户在第一个窗口中填写一些信息 然后单击 确定 这会将他们带到第二个窗口 这工作正常 但我试图将两个窗口合并到一个窗口中 这样只是内容发生了变化 我设法找到了这个更改窗口内容时
  • 实体框架 - 选择特定列并返回强类型而不丢失强制类型转换

    我正在尝试做类似的事情这个帖子 https stackoverflow com questions 1094931 linq to sql how to select specific columns and return strongly
  • .NET 选项将视频文件流式传输为网络摄像头图像

    我有兴趣开发一个应用程序 它允许我从 xml 构建视频列表 包含视频标题 持续时间等 并将该列表作为我的网络摄像头流播放 这意味着 如果我要访问 ustream tv 或在实时通讯软件上激活我的网络摄像头 我的视频播放列表将注册为我的活动网
  • 什么是 C 语言的高效工作流程? - Makefile + bash脚本

    我正在开发我的第一个项目 该项目将跨越多个 C 文件 对于我的前几个练习程序 我只是在中编写了我的代码main c并使用编译gcc main c o main 当我学习时 这对我有用 现在 我正在独自开展一个更大的项目 我想继续自己进行编译
  • 在 URL 中发送之前对特殊字符进行百分比编码

    我需要传递特殊字符 如 等 Facebook Twitter 和此类社交网站的 URL 为此 我将这些字符替换为 URL 转义码 return valToEncode Replace 21 Replace 23 Replace 24 Rep
  • 已过时 - OpenCV 的错误模式

    我正在使用 OpenCV 1 进行一些图像处理 并且对 cvSetErrMode 函数 它是 CxCore 的一部分 感到困惑 OpenCV 具有三种错误模式 叶 调用错误处理程序后 程序终止 Parent 程序没有终止 但错误处理程序被调
  • 如何构建印度尼西亚电话号码正则表达式

    这些是一些印度尼西亚的电话号码 08xxxxxxxxx 至少包含 11 个字符长度 08xxxxxxxxxxx 始终以 08 开头 我发现这个很有用 Regex regex new Regex 08 0 9 0 9 0 9 0 9 0 9
  • 如何在内存中存储分子?

    我想将分子存储在内存中 这些可以是简单的分子 Methane CH4 C H bond length 108 7 pm H H angle 109 degrees But also more complex molecules like p
  • ListDictionary 类是否有通用替代方案?

    我正在查看一些示例代码 其中他们使用了ListDictionary对象来存储少量数据 大约 5 10 个对象左右 但这个数字可能会随着时间的推移而改变 我使用此类的唯一问题是 与我所做的其他所有事情不同 它不是通用的 这意味着 如果我在这里
  • GDK3/GTK3窗口更新的精确定时

    我有一个使用 GTK 用 C 语言编写的应用程序 尽管该语言对于这个问题可能并不重要 这个应用程序有全屏gtk window与单个gtk drawing area 对于绘图区域 我已经通过注册了一个刻度回调gtk widget add ti
  • 方法参数内的变量赋值

    我刚刚发现 通过发现错误 你可以这样做 string s 3 int i int TryParse s hello out i returns false 使用赋值的返回值是否合法 Obviously i is but is this th
  • 在 ASP.NET 中将事件冒泡为父级

    我已经说过 ASP NET 中的层次结构 page user control 1 user control 2 control 3 我想要做的是 当控件 3 它可以是任何类型的控件 我一般都想这样做 让用户用它做一些触发回发的事情时 它会向

随机推荐

  • java中的多线程应用程序登录

    在多线程环境中进行日志记录的最佳方法和最佳工具是什么 以便每个线程都有自己的记录器实例和单独的文件 这可能吗 您可以尝试使用自定义 Log4J 附加程序 它采用线程 id 作为参数 并根据线程调用它来过滤消息 即时创建它 将其附加到记录器
  • Java 日期与日历

    有人可以建议当前的 最佳实践 吗Date and Calendar types 当编写新代码时 最好总是支持Calendar over Date 或者是否存在这样的情况Date是更合适的数据类型 Date 是一个更简单的类 主要是出于向后兼
  • 获取 Python Decimal 的精确十进制字符串表示形式?

    如果我有一个PythonDecimal 如何可靠地获得数字的精确十进制字符串 即不是科学记数法 表示而不带尾随零 例如 如果我有 gt gt gt d Decimal 1e 14 我想 gt gt gt get decimal string
  • 我应该学习原生 iOS 开发 (Objective-C) 还是完善 Javascript 和 Titanium Appcelerator 知识? [关闭]

    Closed 这个问题是基于意见的 目前不接受答案 基本上我需要你的建议 我的好朋友们 D 在过去的六个月里 我正在探索 学习 开发 iOS 应用程序钛加速器移动框架 我的经历大多是好的或非常好的 一些消极的部分钛的使用会耗费构建时间 尤其
  • 在 Go 中执行 shell 命令

    我希望在 Go 中执行 shell 命令 并在程序中以字符串形式获取结果输出 我看到了罗塞塔代码版本 package main import fmt import exec func main cmd err exec Run bin ls
  • C# 不同的转换方式 -- (T)obj 与 obj as T [重复]

    这个问题在这里已经有答案了 可能的重复 强制转换与在 CLR 中使用 as 关键字 我在 C 中见过两种不同的转换方式 例如 MyObj foo MyObj bar this is what I see most of the times
  • 如何防止软键盘出现在我的活动中?

    我正在编写一个以全屏横向模式运行的 Android 游戏 并且按钮位于窗口的左下角和右下角 问题是这些按钮之一 在许多手机上 就在 菜单 按钮旁边 因此玩家可能会意外地按 菜单 如果短暂按下它 我只需暂停游戏并显示游戏内菜单 那里没问题 但
  • gitlab 中的奇怪错误:致命:协议错误:行长度字符错误:Depl

    在我的一台服务器上 当我尝试在 gitlab 上 pull ls remote 新建的存储库时 出现以下错误 git ls remote email protected mas vem dinnerdelivery git fatal pr
  • 为 JPanel 添加鼠标监听器

    今天我遇到一个问题 我的程序制作了一个 8x8 网格 并在单击时显示坐标JButton 但我拒绝使用JButton我需要去JPanel 但是我的addMouseListener不工作 所以我不知道如何才能修复我从 4 小时开始搜索的问题 p
  • 在 PHP 中创建不带括号的函数,例如“echo”

    我想知道是否有任何在 PHP 中编写函数的好方法 这样它们就不需要在参数周围使用 Example function sayThis str echo str sayThis hi 谢谢 马特 穆勒 根本没有 echo 更像是一个运算符而不是
  • Wordpress:为用户创建新的 usermeta 字段

    如何创建带有下拉选择值的新用户元字段 我想为所有用户创建一个条件语句 并具有我想要的新自定义字段的特定值 例如 新字段为 Approved 下拉值为 是和否 条件语句将识别 已批准 字段值为 是 的所有用户 然后它会发布一个代码 我正在使用
  • 让 VS2015 验证 C# 早期语法以保持与 VS2013 兼容的方法

    我遇到的一个具体问题是 VS2015 允许您使用更新的 C 语法 例如public string MyProperty gt myProperty 当针对 NET 4 0 框架项目 然后其他人在 VS2013 中打开该项目时 会出现编译器错
  • 如何转义 R 中的反斜杠? [复制]

    这个问题在这里已经有答案了 我正在 R 中工作 并且在逃避反斜杠时遇到麻烦 我正在使用图书馆stringr install packages stringr repos http cran us r project org library
  • NaN 上的宇宙飞船运算符

    在进行太空船比较操作时 C 如何处理浮点 NaN 我们知道通常的比较总是返回 false 那么 NaN 会如何改变呢 std numeric limits
  • iOS 6 应用程序 - 如何处理 iPhone 5 屏幕尺寸? [复制]

    这个问题在这里已经有答案了 可能的重复 如何开发或迁移适用于 iPhone 5 屏幕分辨率的应用程序 我只是想知道我们应该如何应对 iPhone 5 更大的屏幕尺寸 由于它的高度像素更多 像 GCRectMake 这样使用坐标的东西 并且只
  • 杀死java中的无限循环

    我正在使用第三方库来处理大量数据集 该过程偶尔会进入无限循环 或被阻塞 不知道为什么并且无法进入代码 我想在设定的时间后杀死它并继续下一个案例 一个简单的例子是 for Object data dataList Object result
  • 使用父模型获取填充嵌套集合

    我有以下带有嵌套集合的模型 var Mdl Backbone Model extend initialize function collection this col1 new NestedCollection 我想在一个请求中发送模型和集
  • 如何触发 JavaScript 事件点击

    我的页面中有一个超链接 我正在尝试自动点击超链接以进行测试 有什么方法可以使用 JavaScript 模拟超链接的 50 次点击吗 a href target blank MSDN a 我正在寻找来自 JavaScript 的 onClic
  • QuickCheckAll 始终返回“True”

    我正在尝试使用 QuickCheck 以下另一个答案 我这样测试 LANGUAGE TemplateHaskell import Test QuickCheck import Test QuickCheck All last a gt a
  • 继承模板方法

    我有一个类似于以下内容的课程 class SomeClass public template