基于编译时类型的调度

2024-04-12

遵循“现代 C++ 设计”的技术,我正在实现一个具有各种编译时优化的持久性库。如果模板化成员变量派生自给定类,我希望能够将函数分派给该变量:

template<class T, template <class> class Manager = DefaultManager> class Data
{
private:
   T *data_;

public:
   void Dispatch()
   {
      if(SUPERSUBCLASS(Container, T))
      {
         data_->IKnowThisIsHere();
      }
      else
      {
         Manager<T>::SomeGenericFunction(data_);
      }
   }
}

其中 SUPERSUBCLASS 是一个编译时宏,用于确定对象继承。当然,在 T 确实从 Container 继承(或者 T 是内部类型等)的所有情况下,这都会失败,因为编译器正确地抱怨 IKnowThisIsHere() 不是数据成员,即使永远不会遵循此代码路径,使用 T = int 进行预处理后如下所示:

private:
   int *data_;

public:
   void Dispatch()
   {
      if(false)
      {
         data_->IKnowThisIsHere();

编译器明显抱怨这段代码,即使它永远不会被执行。使用dynamic_cast的建议也不起作用,因为在编译时再次尝试进行类型转换是不可能的(例如使用T=double,std::string):

void Dispatch()
   {
      if(false)
      {
         dynamic_cast<Container*>(data_)->IKnowThisIsHere();

error: cannot dynamic_cast '((const Data<double, DefaultManager>*)this)->Data<double, DefaultManager>::data_' (of type 'double* const') to type 'class Container*' (source is not a pointer to class)
error: cannot dynamic_cast '((const Data<std::string, DefaultManager>*)this)->Da<sttad::string, DefaultManager>::data_' (of type 'struct std::string* const') to type 'class Container*' (source type is not polymorphic)

我真的需要模拟(或者确实说服!)如果 T 确实从 Container 继承,则让编译器发出一组代码,如果不从 Container 继承,则发出另一组代码。

有什么建议么?


重载对于实现编译时调度很有用,正如所建议的那样亚历山德雷斯库在他的书《现代 C++ 设计》中。

您可以使用这样的类在编译时将布尔值或整数转换为类型:

template <bool n>
struct int2type
{ enum { value = n}; };

以下源代码显示了可能的应用:

#include <iostream>

#define MACRO()   true  // <- macro used to dispatch 

template <bool n>
struct int2type
{ enum { value = n }; };

void method(int2type<false>)
{ std::cout << __PRETTY_FUNCTION__  << std::endl; }

void method(int2type<true>)
{ std::cout << __PRETTY_FUNCTION__  << std::endl; }

int
main(int argc, char *argv[])
{
    // MACRO() determines which function to call
    //

    method( int2type<MACRO()>()); 

    return 0;
}

当然,真正完成这项工作的是 MACRO() 或作为元函数的更好实现

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

基于编译时类型的调度 的相关文章

  • 没有强命名的代码签名是否会让您的应用程序容易被滥用?

    尝试了解authenticode代码签名和强命名 我是否正确地认为 如果我对引用一些 dll 非强命名 的 exe 进行代码签名 恶意用户就可以替换我的 DLL 并以看似由我签名但正在运行的方式分发应用程序他们的代码 假设这是真的 那么您似
  • 我如何才能等待多个事情

    我正在使用 C 11 和 stl 线程编写一个线程安全队列 WaitAndPop 方法当前如下所示 我希望能够将一些内容传递给 WaitAndPop 来指示调用线程是否已被要求停止 如果 WaitAndPop 等待并返回队列的元素 则应返回
  • 为什么两个不同的 Base64 字符串的转换会返回相等的字节数组?

    我想知道为什么从 base64 字符串转换会为不同的字符串返回相同的字节数组 const string s1 dg const string s2 dq byte a1 Convert FromBase64String s1 byte a2
  • 秒表有最长运行时间吗?

    多久可以Stopwatch在 NET 中运行 如果达到该限制 它会回绕到负数还是从 0 重新开始 Stopwatch Elapsed返回一个TimeSpan From MSDN https learn microsoft com en us
  • 不支持将数据直接绑定到存储查询(DbSet、DbQuery、DbSqlQuery)

    正在编码视觉工作室2012并使用实体模型作为我的数据层 但是 当页面尝试加载时 上面提到的标题 我使用 Linq 语句的下拉控件往往会引发未处理的异常 下面是我的代码 using AdventureWorksEntities dw new
  • ASP.NET MVC:这个业务逻辑应该放在哪里?

    我正在开发我的第一个真正的 MVC 应用程序 并尝试遵循一般的 OOP 最佳实践 我正在将控制器中的一些简单业务逻辑重构到我的域模型中 我最近一直在阅读一些内容 很明显我应该将逻辑放在域模型实体类中的某个位置 以避免出现 贫血域模型 反模式
  • HTTPWebResponse 响应字符串被截断

    应用程序正在与 REST 服务通信 Fiddler 显示作为 Apps 响应传入的完整良好 XML 响应 该应用程序位于法属波利尼西亚 在新西兰也有一个相同的副本 因此主要嫌疑人似乎在编码 但我们已经检查过 但空手而归 查看流读取器的输出字
  • Clang 3.1 + libc++ 编译错误

    我已经构建并安装了 在前缀下 alt LLVM Clang trunk 2012 年 4 月 23 日 在 Ubuntu 12 04 上成功使用 GCC 4 6 然后使用此 Clang 构建的 libc 当我想使用它时我必须同时提供 lc
  • 如何从 appsettings.json 文件中的对象数组读取值

    我的 appsettings json 文件 StudentBirthdays Anne 01 11 2000 Peter 29 07 2001 Jane 15 10 2001 John Not Mentioned 我有一个单独的配置类 p
  • 显示UnityWebRequest的进度

    我正在尝试使用下载 assetbundle统一网络请求 https docs unity3d com ScriptReference Networking UnityWebRequest GetAssetBundle html并显示进度 根
  • 控件的命名约定[重复]

    这个问题在这里已经有答案了 Microsoft 在其网站上提供了命名指南 here http msdn microsoft com en us library xzf533w0 VS 71 aspx 我还有 框架设计指南 一书 我找不到有关
  • 垃圾收集器是否在单独的进程中运行?

    垃圾收集器是否在单独的进程中启动 例如 如果我们尝试测量某段代码所花费的进程时间 并且在此期间垃圾收集器开始收集 它会在新进程上启动还是在同一进程中启动 它的工作原理如下吗 Code Process 1 gt Garbage Collect
  • 什么时候虚拟继承是一个好的设计? [复制]

    这个问题在这里已经有答案了 EDIT3 请务必在回答之前清楚地了解我要问的内容 有 EDIT2 和很多评论 有 或曾经 有很多答案清楚地表明了对问题的误解 我知道这也是我的错 对此感到抱歉 嗨 我查看了有关虚拟继承的问题 class B p
  • 这些作业之间是否存在顺序点?

    以下代码中的两个赋值之间是否存在序列点 f f x 1 1 x 2 不 没有 在这种情况下 标准确实是含糊不清的 如果你想确认这一点 gcc 有这个非常酷的选项 Wsequence point在这种情况下 它会警告您该操作可能未定义
  • 使用 x509 证书签署 json 文档或字符串

    如何使用 x509 证书签署 json 文档或字符串 public static void fund string filePath C Users VIKAS Desktop Data xml Read the file XmlDocum
  • 通过指向其基址的指针删除 POD 对象是否安全?

    事实上 我正在考虑那些微不足道的可破坏物体 而不仅仅是POD http en wikipedia org wiki Plain old data structure 我不确定 POD 是否可以有基类 当我读到这个解释时is triviall
  • 如何在Xamarin中删除ViewTreeObserver?

    假设我需要获取并设置视图的高度 在 Android 中 众所周知 只有在绘制视图之后才能获取视图高度 如果您使用 Java 有很多答案 最著名的方法之一如下 取自这个答案 https stackoverflow com a 24035591
  • C# 成员变量继承

    我对 C 有点陌生 但我在编程方面有相当广泛的背景 我想做的事情 为游戏定义不同的 MapTiles 我已经像这样定义了 MapTile 基类 public class MapTile public Texture2D texture pu
  • 混合 ExecutionContext.SuppressFlow 和任务时 AsyncLocal.Value 出现意外值

    在应用程序中 由于 AsyncLocal 的错误 意外值 我遇到了奇怪的行为 尽管我抑制了执行上下文的流程 但 AsyncLocal Value 属性有时不会在新生成的任务的执行范围内重置 下面我创建了一个最小的可重现示例来演示该问题 pr
  • IEnumreable 动态和 lambda

    我想在 a 上使用 lambda 表达式IEnumerable

随机推荐

  • 如何在 gdb 中附加进程

    我有一个简单的 C 程序 它分叉一个进程 然后运行一个可执行文件 我想将子进程附加到 gdb 我在控制台中运行主程序并打开另一个控制台来查找子进程的 pid 然后使用以下命令启动 gdb gdb attach 12271 where 122
  • 不需要的空白导致列扭曲

    我正在尝试从间隔 非制表符 的 txt 文件导入化学品列表 NO FORMULA NAME CAS No A B C D TMIN TMAX code ngas TMIN ngas 25 C ngas TMAX 1 CBrClF2 brom
  • 如何在函数声明中声明 C++ mem_fn(member_function) ?

    我理解将成员函数的地址传递到类之外的基本问题 我感觉 mem fn 可能是解决方案 但我在具体细节上遇到了麻烦 我在类 p 中有一个成员函数 当前声明为 typedef void valNamedFlagsCallback const in
  • 创建半透明或透明窗口从透明到鼠标事件,添加到表单的控件除外

    您好 我试图获得像玻璃一样的透明形式 它可以使点击和每个鼠标事件传递到玻璃后面的窗口或项目 这是我用 Windows 窗体编写的代码 namespace ClickThroughMe public partial class ClickTh
  • 错误 1 ​​无法将类型“double”隐式转换为“int”。存在显式转换(您是否缺少转换?)[关闭]

    Closed 这个问题是无法重现或由拼写错误引起 help closed questions 目前不接受答案 我的 C 代码有一个错误 他们说 错误 1 无法将类型 double 隐式转换为 int 存在显式转换 是否缺少强制转换 错误在哪
  • 何时在 Java 中使用“this”

    我为我的琐碎且可能愚蠢的问题道歉 但我对在使用方法或访问某些内容时何时使用 this 前缀感到有点困惑 例如 如果我们看 4 这里 http apcentral collegeboard com apc public repository
  • 按钮和 GLSurfaceView

    我有一个 GLSurfaceView 我在其中使用 OpenGL 显示一些动画 我现在想向该视图添加一个按钮 这是如何实现的 不涉及xml布局可以做到吗 您可以手动构建视图并将其添加到活动的内容视图中 在 GLSurfaceView 上执行
  • 从 RDF 节点拉出字符串

    在使用 Jena 的 SPARQL 查询时 我试图以更易读的格式获取数据 但是我不知道如何以正确的方式提取数据 就目前而言 输出是 http www w3 org TR 2003 PR owl guide 20031209 wine Sau
  • 错误:增强禁用线程

    我的 boost 库有一些问题 我正在使用 freebsd 并使用 ports 安装了我的 boost Boost 版本是 1 45 我使用 g 47 作为编译器 另外 我从未在那里定义过 BOOST DISABLE THREADS usr
  • PHP json_decode 表示法问题

    我在处理我尝试解析的 JSON 文件中使用的符号时遇到问题 一些节点有 句点 在转义对象表示法的名称中 json article gt rssFeed url 我将如何选择节点 我是否需要 str replace 句点 或者是否可以使用其他
  • 如何通过 Xcode Designer 添加 MPVolumeView?

    我最初将 MPVolumeView 动态添加到页面上 import MediaPlayer MPVolumeView h IBAction handleVolumeButtonClicked id sender if volumeView
  • 这个 C++ 程序有什么问题?

    当我编译这个程序时 include
  • ROCKSDB 由于rocksdb_max_row_locks 无法获取锁

    我尝试将 CSV 加载到 Rocksdb 数据库中 但失败并显示以下错误 Got error 10 Operation aborted Failed to acquire lock due to rocksdb max row locks
  • 图像尺寸(drawable-hdpi/ldpi/mdpi/xhdpi)

    研究android 现在我有一些图像要放入可绘制目录 hdpi ldpi mdpi xhdpi 中 我读了很多 但我还是不明白 每个目录的图像尺寸应该是多少 希望这会有所帮助 mdpi 是参考密度 也就是说 mdpi 显示屏上的 1 像素等
  • 如何在引导模式上设置本地存储?

    modal 2 id 打开调查模式 我想要的只是这个特定的模式 在有人单击关闭按钮后每 24 小时重新出现一次 document ready function var modals events if window location has
  • 类型声明之前的问号(?)在php(?int)中意味着什么[重复]

    这个问题在这里已经有答案了 我在中看到过这段代码https github com symfony symfony blob master src Symfony Component Console Output Output php htt
  • 以编程方式添加项目引用

    基本上 在阅读了几个链接后 我尝试了上面的代码 foreach EnvDTE Project proj in soln Projects if proj Name BLL VSLangProj VSProject vsproj VSLang
  • Apple Mach-O 链接器错误 lxml

    我刚刚将 xcode 升级到 4 5 现在编译时出现错误 ld library not found for lxml2 2 7 3 cland error linker command failed with exit code 1 升级后
  • 窗口函数或公共表表达式:计算范围内的前几行

    我想使用窗口函数来确定每一行满足特定条件的先前记录的总数 一个具体的例子 clone d test Table pg temp 2 test Column Type Modifiers id bigint date timestamp wi
  • 基于编译时类型的调度

    遵循 现代 C 设计 的技术 我正在实现一个具有各种编译时优化的持久性库 如果模板化成员变量派生自给定类 我希望能够将函数分派给该变量 template