使用模板元编程进行计数?

2023-11-25

一段时间以来,我一直在尝试(断断续续地)想出一个创造性的解决方案来解决这个问题,但到目前为止我还没有做到。我最近认为它可能可以通过模板元编程来解决,尽管由于我相对缺乏该技术的经验,我不确定。

是否可以使用模板元编程(或 C++ 语言的任何其他机制)来计算从某个基类派生的类的数量,以便为每个派生类提供唯一的静态类标识符?

提前致谢!


不。这是一个在实践中经常出现的问题,据我所知,只有两种解决方案:

  1. 手动为每个派生类分配 ID。
  2. 动态且延迟地非确定性地生成 ID。

执行第二个方法的方式如下:

class Base
{
    virtual int getId() const = 0;
};

// Returns 0, 1, 2 etc. on each successive call.
static int makeUniqueId()
{
    static int id = 0;
    return id++;
}

template <typename Derived>
class BaseWithId : public Base
{
    static int getStaticId()
    {
        static int id = makeUniqueId();
        return id;
    }

    int getId() const { return getStaticId(); }
};

class Derived1 : public BaseWithId<Derived1> { ... };
class Derived2 : public BaseWithId<Derived2> { ... };
class Derived3 : public BaseWithId<Derived3> { ... };

这为您提供了每个类别的唯一 ID:

Derived1::getStaticId(); // 0
Derived2::getStaticId(); // 1
Derived3::getStaticId(); // 2

但是,这些 ID 是延迟分配的,因此您调用的顺序getId()影响ID的返回。

Derived3::getStaticId(); // 0
Derived2::getStaticId(); // 1
Derived1::getStaticId(); // 2

这是否适合您的应用程序取决于您的特定需求(例如,不利于序列化)。

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

使用模板元编程进行计数? 的相关文章

随机推荐

  • ASP.NET WEB API 未绑定到 POST 上的动态对象

    如果有以下 Api 控制器 使用 StrutureMap 进行 DI using System using System Dynamic using System Net using System Net Http using System
  • python pandas:从财政年度和月份获取财政季度(针对英国)

    我有一个数据框 其中有两个有用的列 1 财政年度 2 日期 我想添加一个显示财政季度的新列 仅供参考 英国财政年度为 4 月 1 日至 3 月 31 日 我的数据如下所示 fiscal year date FY15 16 2015 11 0
  • 如何使用 HTTP 将 CORS 规则添加到 Azure 存储模拟器?

    要使用 Azure 存储 模拟器 表服务 我需要为我的 TypeScript 浏览器应用程序添加 CORS 规则 我想使用 REST 接口 来自 Postman 而不是具有同源策略的浏览器 手动添加该规则 该文档没有给出模拟器的正确 URL
  • 为什么 IIS 比 ASP.NET 开发服务器慢?

    我有一个 ASPX 网页 它执行一些复杂的操作和数据库调用 当我通过运行 ASP NET Development Server Cassini 查看网页时 大约需要200ms Then 无需更改任何代码和配置 我将网站部署到本地计算机 II
  • Java FX 2 警报声音

    如何在 Java FX 2 中播放警报声音 有没有办法使用操作系统默认通知声音 使用纯 JavaFX 播放声音 只需使用一个实例AudioClip 这非常适合仅演奏单个短音 播放默认通知声音 关于 Windows 操作系统 有一种方法可以通
  • 自定义首选项 Android Kotlin

    我想子类化Preference在 Kotlin 中创建自定义首选项 我无法在 首选项 屏幕中获取要膨胀的自定义首选项 如果我从我的首选项屏幕中删除此自定义首选项 我已实现的其余首选项 此处未显示 工作正常 类似的还有很多seeming这里有
  • Google Maps JS API v3 - 简单的多标记示例

    Google Maps Api 相当新 我有一组数据想要循环浏览并绘制在地图上 看起来相当简单 但我发现的所有多标记教程都相当复杂 让我们使用 Google 网站上的数据数组作为示例 var locations Bondi Beach 33
  • Cloud Endpoint 参数不应命名

    我想发送一个HashMap
  • 跨域获取iframe当前src url [重复]

    这个问题在这里已经有答案了 我的网络应用程序中有一个 iframe 我需要从父文档获取其当前 url 当用户导航框架并更改原始源 url 时 只需要 URL 即可进行社交分享 作为跨域场景 我不拥有子文档 它是远程域 我知道同源策略可以防止
  • 在 UIWebView 中启用 Cookie

    如何在使用 UIWebView 窗口的 iPhone 应用程序中启用 cookie 以便我的登录系统正常工作 肯定是从 NSHTTPCookieStorage sharedHTTPCookieStorage cookieAcceptPoli
  • 在一定时间后自动关闭窗口

    在一个类中 在一个函数中 我正在创建一个 Tkinter Canvas 该函数正在被另一个类调用 我希望 Tkinter 窗口弹出 30 秒 然后自行关闭 我有打电话 master mainloop time sleep 30 master
  • 如果字段值为空,如何告诉 Jackson 在序列化期间忽略该字段?

    如果该字段的值为空 如何将 Jackson 配置为在序列化期间忽略该字段值 例如 public class SomeClass what jackson annotation causes jackson to skip over this
  • 在 Swift 中,为什么分配给静态变量也会调用它的 getter

    我知道在 Swift 中 静态变量是隐式惰性的 https stackoverflow com a 34667272 1672161 但我不清楚为什么会发生这种情况 protocol HatType class Hat HatType in
  • C++ 中的运算符=重载

    在 C Primer 一书中 它有一个 C 风格字符数组的代码 并展示了如何重载 文章中的运算符15 3 运算符 String String operator const char sobj sobj is the null pointer
  • 发布子类集合

    我要求用户编辑潜在客户的报价列表 报价可以是不同的类型 例如 产品类型 A 的报价 产品类型 B 的报价 所有报价类型共享一个公共基类 例如 QuoteBase 我的报价在前端显示得很好 并且似乎也回发了正确的数据 然而 在服务器上它显然不
  • 如何使用ADB将一些文本复制到android系统剪贴板?

    我想在我的 root Android Oreo 上自动执行一些操作 但似乎找不到将某些文本复制到剪贴板的方法 我可以粘贴复制的文本adb shell input keyevent 279所以希望能找到一些复制文本的方法 P S 不寻找建议的
  • 构造函数的模板参数推导[重复]

    这个问题在这里已经有答案了 C 0x 是否具有 或者 C 0x 在某个时间点将会具有 构造函数的模板参数推导 在即将推出的 C C 0x 标准概述 我看到了以下几行 std lock guard l m at 7 00 std thread
  • 使用 C++ 源代码包含相关的 Boost 库(使用 Visual Studio)

    我正在开发一个项目 为学校 我正在深入研究 Boost 库来寻找解决方案 我需要某种方法来将所需的 Boost 源代码与我的应用程序一起分发 以便可以在不需要在系统上安装库进行编译的情况下对其进行编译 学校电脑几乎没有你能提到的任何东西 学
  • IE TextRange 选择方法无法正常工作

    我在使用 contentEditable 设置为 true 的 IE 文档时遇到异常问题 在位于紧邻块元素之前的文本节点末尾的范围上调用 select 会导致选择内容向右移动一个字符并出现在不应出现的位置 我已向 Microsoft 提交了
  • 使用模板元编程进行计数?

    一段时间以来 我一直在尝试 断断续续地 想出一个创造性的解决方案来解决这个问题 但到目前为止我还没有做到 我最近认为它可能可以通过模板元编程来解决 尽管由于我相对缺乏该技术的经验 我不确定 是否可以使用模板元编程 或 C 语言的任何其他机制