不同源文件中的 D 模板特化

2024-01-13

我最近问this https://stackoverflow.com/questions/6328444/type-classes-in-d有关如何在 D 中模拟类型类的问题,并建议了一种使用模板专业化来实现此目的的方法。

我发现 D 无法识别不同源文件中的模板专业化。因此,我不能只对未包含在定义通用函数的文件中的文件进行专门化。为了说明这一点,请考虑以下示例:

//template.d
import std.stdio;
template Generic(A) {
  void sayHello() {
    writefln("Generic");
  }
}

void testTemplate(A)() {
    Generic!A.sayHello();
}


//specialization.d
import std.stdio;
import Template;

template Generic(A:int) {
  void sayHello() {
      writefln("only for ints");
  }
}

void main() {
    testTemplate!int();
}

当我运行此代码时,它会打印“generic”。所以我问是否有一些好的解决方法,以便可以从算法中使用更专门的形式。

我在有关类型类的问题中使用的解决方法是在导入具有模板专业化的所有文件后混合通用函数,但这有点丑陋且有限。

我听说 c++1x 将有 extern 模板,这将允许这样做。 D 有类似的功能吗?


我想我可以对这个问题做出正确的回答。不。

您想要做的是劫持 template.d 的功能(文件上的大小写也应该匹配并导入模板,某些操作系统很重要)。考虑:

// template.d
...

// spezialisation.d
import std.stdio;
import template;

void main() {
    testTemplate!int();
}

现在有人更新了代码:

// specialization.d
import std.stdio;
import template;
import helper;

void main() {
    testTemplate!int();
    getUserData();
}

完美吧?井内助手:

// helper.d
getUserData() { ... }


template Generic(A:int) {
    A placeholder; //...
}

现在,您仅通过导入更改了 professionalization.d 的行为,实际上这将无法编译,因为它无法调用 sayHello。这种劫持预防确实有其问题。例如,您可能有一个接受 Range 的函数,但库的使用者无法传递数组,除非您的库导入 std.array,因为这是数组“转换”为范围的地方。

我没有解决您问题的方法。

Michal 的评论为第二种形式的劫持提供了解决方案,其中表示 professionalization.d 试图劫持 getUserData

// specialization.d
import std.stdio;
import template;
import helper;

alias helper.getUserData getUserData;

string getUserData(int num) { ... }

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

不同源文件中的 D 模板特化 的相关文章

  • 如何使用 Codeigniter 从另一个视图中加载视图文件,而无需通过控制器?

    我正在努力寻找此问题的解决方案 我需要从另一个视图中加载视图 我知道 通常我只需要这样做 但这一次 文件路径被传递到数据文件标记的属性 我有 a href 实际上 这是由 JavaScript 函数用来自行加载视图的 因此 当这样做时 它会
  • 解决C++中涉及多重继承和复合类的设计

    我已经为这个设计问题苦苦挣扎了一段时间 我将尽力解释我正在尝试做的事情以及我所看到的各种方法 我正在尝试什么以及为什么 我在科学计算环境中工作 反复处理相同类型的对象 想象一个包含太阳系的星系 每个太阳系都包含行星系统 每个行星系统都包含卫
  • 模板继承内部类访问问题

    我不敢相信gcc不会接受以下代码 请告诉我是否确实不可能从基本模板访问内部类 或者我是否遗漏了某些内容 template
  • 将指针作为模板参数传递给成员函数。为什么这有效?

    我有一些代码 100 适用于我的用例 我只是想知道是否有人可以解释它是如何以及为什么工作的 我有一个模板类 位于一些处理线程和网络通信的代码与库用户之间 用于将从服务器接收到的数据传递给用户 template
  • 使用 typename 参数时,模板参数推导/替换失败

    我有以下代码 它定义了一个模板结构W导出一个类型T这是基于模板参数W include
  • 我们如何修改检测工具包来检查一个类是否具有具有特定签名的成员函数?

    鉴于 减少 实施检测惯用语 http www open std org jtc1 sc22 wg21 docs papers 2015 n4502 pdf namespace type traits template
  • C++ 中不带 virtual 的多态实现多级继承

    我有一种情况 我需要在没有 vtable 的情况下实现多态性 这就是我想做的 存在类层次结构 C 扩展 B B 扩展 A 其思想是在A中声明一个函数指针 然后B和C的构造函数将其相应的方法分配给A中的函数指针 通过下面的代码 我能够实现 C
  • 静态数组VS。 C++11 中的动态数组

    我知道这是一个非常古老的争论 全世界已经讨论过很多次了 但我目前很难决定在特定情况下应该使用静态数组和动态数组之间的哪种方法而不是另一种方法 实际上 我不会使用 C 11 我会使用静态数组 但我现在很困惑 因为两者可能有相同的好处 第一个解
  • 强制初始化模板类的静态数据成员

    关于模板类的静态数据成员未初始化存在一些问题 不幸的是 这些都没有能够帮助我解决我的具体问题的答案 我有一个模板类 它有一个静态数据成员 必须为特定类型显式实例化 即必须专门化 如果不是这种情况 使用不同的模板函数应该会导致链接器错误 这是
  • 如何递归取消引用指针(C++03)?

    我正在尝试在 C 中递归地取消引用指针 如果传递一个对象 那就是not一个指针 这包括智能指针 我只想返回对象本身 如果可能的话通过引用返回 我有这个代码 template
  • Django 模板 - 我可以设置要在父模板中使用的变量吗?

    我有一个包含通用导航菜单的父模板 我希望能够添加class selected 到适当的菜单选项 我希望能够在子模板中设置变量 例如 set menu products and do ifequal menu products class s
  • 非模板类与模板类的多个定义

    为什么编译器会抱怨多个 cpp 文件中定义的非模板类 但对于其定义在各个 cpp 文件中重复的模板类 通过包含该类的 inl 文件 却没问题 即使类是否在多个 cpp 文件中显式实例化 非模板情况是因为在这种情况下您的程序违反了一个定义规则
  • 是否可以使用标签调度来确定返回类型

    标签调度在从模板切换传递的类型 https stackoverflow com questions 4522375 switch passed type from template 是否可以 如果可以的话 做类似的事情 struct Tag
  • Pug 从模板内的另一个文件调用 js 函数

    我花了将近四个小时都无法解决这个问题 而且我找不到任何针对此类问题的有用文档 这就是问题 我正在使用 pug jade 模板 我想调用 pug 模板内的函数来转换一些数据 这是主要模板 main template section each
  • 将完整模板参数值映射到原始类型

    我想将数字映射到类型 在这个例子中 我将创建一个函数 将 sizeof 结果映射到有符号的原始类型 我想知道是否有更好的方法来完成我在现代 C 中所做的事情 即采用模板化值并将其转换为类型 现在 这可以将大小转换为已知类型 但我似乎无法在标
  • C++ 模板参数作为函数调用名称

    在 C 中 可以做出这样的事情 class A public template
  • Kohana 3.1 中的模板

    我几个月前就用过它们 然后我改用燃料 然后我又切换回 Kohana 问题 我忘记了如何正确使用模板 我的意思是Controller Template 有教程 http kohanaframework org 3 1 guide kohana
  • Ajax 调用后使用 Django 模板呈现 JSON 对象

    我一直在尝试了解什么是最佳方法Ajax http en wikipedia org wiki Ajax 28programming 29 in Django http en wikipedia org wiki Django 28web f
  • 我可以对(非成员)函数使用部分模板特化吗?

    我试图在 非成员 函数上使用部分模板专业化 但我在语法上遇到了问题 我在 StackOverflow 中搜索了其他部分模板专业化问题 但这些问题涉及类或成员函数模板的部分专业化 作为起点 我有 struct RGBA RGBA uint8
  • 类型别名和不完整类型

    我可能已经超出了解决这个本应简单的问题的范围 我在这里开始这个问题 在编译时获取基类的类型 https stackoverflow com questions 17735852 getting type of a base class at

随机推荐