所有子类的 C++ 模板专门化

2023-11-25

我需要创建一个像这样的模板函数:

template<typename T>
void foo(T a)
{
   if (T is a subclass of class Bar)
      do this
   else
      do something else
}

我也可以想象使用模板专业化来做到这一点......但我从未见过针对超类的所有子类的模板专业化。我不想为每个子类重复专门化代码


你可以做你想做的事,但不能做你想做的事!您可以使用std::enable_if和...一起std::is_base_of:

#include <iostream>
#include <utility>
#include <type_traits>

struct Bar { virtual ~Bar() {} };
struct Foo: Bar {};
struct Faz {};

template <typename T>
typename std::enable_if<std::is_base_of<Bar, T>::value>::type
foo(char const* type, T) {
    std::cout << type << " is derived from Bar\n";
}
template <typename T>
typename std::enable_if<!std::is_base_of<Bar, T>::value>::type
foo(char const* type, T) {
    std::cout << type << " is NOT derived from Bar\n";
}

int main()
{
    foo("Foo", Foo());
    foo("Faz", Faz());
}

由于这些东西变得越来越广泛,人们开始讨论是否有某种static if但到目前为止它还没有出现。

Both std::enable_if and std::is_base_of(声明于<type_traits>) 是 C++2011 中的新增内容。如果您需要使用 C++2003 编译器进行编译,您可以使用它们的实现Boost(您需要将命名空间更改为boost并包括"boost/utility.hpp" and "boost/enable_if.hpp"而不是相应的标准标题)。或者,如果您不能使用 Boost,这两个类模板都可以很容易地实现。

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

所有子类的 C++ 模板专门化 的相关文章

随机推荐

  • 如何忽略 mod_rewrite 中的目录?

    我试图让 modrewrite 规则跳过该目录vip 我已经尝试了很多方法 如下所示 但没有成功 BEGIN WordPress
  • 将 VS Code Jupyter Notebook 中的输出折叠到可滚动窗口中

    有没有办法在 VS Code Jupyter Notebook 的可滚动窗口中显示输出 例如很长的数据帧 我知道按字母 o 可以折叠所有输出 但拥有可滚动窗口仍然更好 因为它允许您在引用其他窗口的同时检查输出 我也检查了这个link但无法让
  • 如何检查字符串中是否有特殊字符或者某个字符是否是GoLang中的特殊字符

    从输入读取字符串后 我需要检查其中是否有特殊字符 您可以使用 strings ContainsAny 来查看符文是否存在 package main import fmt strings func main fmt Println strin
  • numpy.genfromtxt 与 datetime.strptime 转换器

    我有与此类似的数据gist我正在尝试用 numpy 提取数据 我对 python 相当陌生 所以我尝试使用以下代码来做到这一点 import numpy as np from datetime import datetime convert
  • jQuery 追加如果不存在

    我想附加一个div仅当它尚不存在时 我正在尝试这样做 但它不起作用 method id on change function e if this find option selected data method column id 1 if
  • Java:静态类?

    我有一门充满实用功能的课程 实例化它的实例没有语义意义 但我仍然想调用它的方法 处理这个问题的最佳方法是什么 静态类 抽象的 标记为 Final 的类上的私有构造函数和静态方法
  • 为什么 ScheduledExecutorService 不根据需要生成线程?

    在我的应用程序中 我使用 ScheduledExecutorService 但仅生成一个线程来处理计划任务 这是因为 ScheduledExecutorService 不会生成线程来处理挂起的任务吗 下面是一个代码片段 它将仅输出 run
  • CUDA:为什么按位运算符有时比逻辑运算符更快?

    当我要从内核中榨取最后一点性能时 我通常会发现替换逻辑运算符 and with 按位运算符 and 使内核更快一些 这是通过查看 CUDA Visual Profiler 中的内核时间摘要观察到的 那么 为什么按位运算符faster比 CU
  • 如何更改shinydashboard中侧边栏的字体大小

    我是shinydashboard的新手 不熟悉CSS 谁能告诉我如何更改shinydashboard中侧边栏的字体大小 非常感谢 下面是我的代码 library shinydashboard library shiny ui lt dash
  • PHP 中的密码安全

    您认为哪种方法最安全 我从 php net 上取下了这些片段 我只是想知道 因为人们发布了自己的内容 而我只是无法理解为什么有些人是这样的 有人可以帮助我并告诉我更多关于这些的信息吗 哪个最安全 为什么 1 2
  • 为什么我们不能覆盖`||`和`&&`?

    大卫 A 布莱克他在书中指出 条件赋值运算符 以及它很少被发现的 表弟 两者都提供与伪操作符方法相同的快捷方式 但基于操作符 即 and 您无法覆盖它 为什么他特别提到我们不能覆盖 and 与对象上的其他一些运算符不同 对象的行为在逻辑上可
  • 如何与 Kronos API 进行通信?

    我有一个Kronos入口点http kronos wfc XmlService我应该能够访问 但是当我在浏览器中打开它时 响应是
  • 在字符串数组项元素中搜索字符串

    如何在字符串数组项元素内搜索特定文本 以下是 xml 文件的示例 字符串数组名称是 android 我在字符串数组中有一些项目 现在我想搜索 软件 这个词 请告诉我该怎么做
  • C# - 以编程方式推进 Powerpoint 幻灯片放映的方法?

    我希望能够通过按 Windows 窗体中的按钮来推进 Powerpoint 演示文稿 这是我找到的一些代码http bytes com topic c sharp answers 272940 open powerpoint present
  • LINQ to SQL 中的 Guid 类型和(“>”大于比较)

    请帮我 我尝试比较 Where 查询方法中的两个 guid 但我得到编译错误 错误 1 运算符 gt 不能应用于 System Guid 和 System Guid 类型的操作数 Guid startUser Here I get user
  • 克隆存储闭包的结构[重复]

    这个问题在这里已经有答案了 我目前正在尝试用 Rust 实现一个简单的解析器组合器库 为此我想要一个通用的map转换解析器结果的函数 问题是我不知道如何复制持有闭包的结构 一个例子是Map以下示例中的结构体 它有一个mapFunction存
  • 如何链接到 intersphinx 中的根页面

    我已启用sphinx ext intersphinx在我的项目中并添加了以下配置 intersphinx mapping python https docs python org 3 None pyserial https pythonho
  • symfony2:如何在翻译中包含换行符/换行符?

    我该如何在 Symfony 2 4 中获得换行符 messages de yml foo Hello i am a line Hello i am a new line and messages de yml foo gt Hello i
  • 处理取消令牌源的正确模式

    考虑这样一个场景 您需要完成一些异步工作 并且可以在即发即忘模式下运行它 此异步工作能够侦听取消 因此您可以向其传递取消令牌以便能够取消它 在给定时刻 我们可以决定通过使用从中获取取消令牌的取消令牌源对象来请求取消正在进行的活动 因为取消令
  • 所有子类的 C++ 模板专门化

    我需要创建一个像这样的模板函数 template