没有模板参数的模板类的容器

2023-12-24

我想知道您是否可以拥有一个包含具有不同模板参数的对象的容器。

我正在努力实现这样的目标:

#include <iostream>
#include <list>

template <class T>
class base
{
    public:
        T val;
        base(T newVal): val(newVal) {}; 
};

class derived : public base<int>
{
    public:
        derived(int newVal): base(newVal) {}; 
};

int main ( void )
{
    std::list < base<?> > base_collection;
    return 0;
}

我希望我当前的项目尽可能灵活和动态,当需要新的派生类时几乎不需要额外的编码,并且我当前的实现使得这样一个列表的存在非常重要。

是否有一种常用的、有益的、干净的方法来实现这一目标?


一个可能的实现是使用双重调度:

#include <iostream>
#include <list>

struct visitor;

struct dispatchable {
    virtual void accept(visitor &v) = 0;
};

template <class>
struct base;

struct visitor {
    template<typename T>
    void visit(base<T> &);
};

template <class T>
struct base: dispatchable {
    T val;
    base(T newVal): val(newVal) {};
    void accept(visitor &v) override { v.visit(*this); }
};

struct derivedInt : base<int> {
    derivedInt(int newVal): base(newVal) {}; 
};

struct derivedDouble : base<double> {
    derivedDouble(double newVal): base(newVal) {}; 
};

template<>
void visitor::visit(base<int> &) {
    std::cout << "int" << std::endl;
}

template<>
void visitor::visit(base<double> &) {
    std::cout << "double" << std::endl;
}

int main ( void ) {
    visitor v{};
    std::list <dispatchable*> coll;
    coll.push_back(new derivedInt{42});
    coll.push_back(new derivedDouble{.42});
    for(auto d: coll) d->accept(v);
}

这样,您只需定义处理新的专门函数base<T>您想要介绍的类型。
举个例子,如果你想使用base<char>,你必须定义:

template<>
void visitor::visit(base<char> &) {
    std::cout << "char" << std::endl;
}

请注意,我假设您想要对待每个专业化base<T>以不同的方式。否则,定义通用成员函数就足够了visitor::visit并放弃专业。


旁注:不要使用裸指针。
这是一个例子。在生产代码中,我会使用智能指针。

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

没有模板参数的模板类的容器 的相关文章

  • C++ 求二维数组每一行的最大值

    我已经设法用这个找到我的二维数组的每一行的最小值 void findLowest int A Cm int n int m int min A 0 0 for int i 0 i lt n i for int j 0 j lt m j if
  • 如何在没有 Control.Invoke() 的情况下从后台线程修改控件属性

    最近 我们遇到了一些旧版 WinForms 应用程序 我们需要更新一些新功能 在专家测试该应用程序时 发现一些旧功能被破坏 无效的跨线程操作 现在 在您认为我是新手之前 我确实有一些 Windows 窗体应用程序的经验 我不是专家 但我认为
  • SSH 主机密钥指纹与模式 C# WinSCP 不匹配

    我尝试通过 WinSCP 使用 C 连接到 FTPS 服务器 但收到此错误 SSH 主机密钥指纹 与模式不匹配 经过大量研究 我相信这与密钥的长度有关 当使用 服务器和协议信息 下的界面进行连接时 我从 WinSCP 获得的密钥是xx xx
  • 使用 Microsoft Graph API 订阅 Outlook 推送通知时出现 400 错误请求错误

    我正在尝试使用 Microsoft Graph API 创建订阅以通过推送通知获取 Outlook 电子邮件 mentions 我在用本文档 https learn microsoft com en us graph api subscri
  • 跨多个控件共享事件处理程序

    在我用 C 编写的 Windows 窗体应用程序中 我有一堆按钮 当用户的鼠标悬停在按钮上时 我希望按钮的边框发生变化 目前我有以下多个实例 每个按钮一个副本 private void btnStopServer MouseEnter ob
  • 如何针对 Nancy 中的 Active Directory 进行身份验证?

    这是一篇过时的文章 但是http msdn microsoft com en us library ff650308 aspx paght000026 step3 http msdn microsoft com en us library
  • c# Asp.NET MVC 使用FileStreamResult下载excel文件

    我需要构建一个方法 它将接收模型 从中构建excel 构建和接收部分完成没有问题 然后使用内存流导出 让用户下载它 不将其保存在服务器上 我是 ASP NET 和 MVC 的新手 所以我找到了指南并将其构建为教程项目 public File
  • HttpClient 像浏览器一样请求

    当我通过 HttpClient 类调用网站 www livescore com 时 我总是收到错误 500 可能服务器阻止了来自 HttpClient 的请求 1 还有其他方法可以从网页获取html吗 2 如何设置标题来获取html内容 当
  • 基于范围的 for 循环中的未命名循环变量?

    有没有什么方法可以不在基于范围的 for 循环中 使用 循环变量 同时也避免编译器发出有关未使用它的警告 对于上下文 我正在尝试执行以下操作 我启用了 将警告视为错误 并且我不想进行像通过在某处毫无意义地提及变量来强制 使用 变量这样的黑客
  • 在 ASP.Net Core 2.0 中导出到 Excel

    我曾经使用下面的代码在 ASP NET MVC 中将数据导出到 Excel Response AppendHeader content disposition attachment filename ExportedHtml xls Res
  • 使用向量的 merge_sort 在少于 9 个输入的情况下效果很好

    不知何故 我使用向量实现了合并排序 问题是 它可以在少于 9 个输入的情况下正常工作 但在有 9 个或更多输入的情况下 它会执行一些我不明白的操作 如下所示 Input 5 4 3 2 1 6 5 4 3 2 1 9 8 7 6 5 4 3
  • 更改窗口的内容 (WPF)

    我创建了一个简单的 WPF 应用程序 它有两个 Windows 用户在第一个窗口中填写一些信息 然后单击 确定 这会将他们带到第二个窗口 这工作正常 但我试图将两个窗口合并到一个窗口中 这样只是内容发生了变化 我设法找到了这个更改窗口内容时
  • AccessViolationException 未处理

    我正在尝试使用史蒂夫 桑德森的博客文章 http blog stevensanderson com 2010 01 28 editing a variable length list aspnet mvc 2 style 为了在我的 ASP
  • EPPlus Excel 更改单元格颜色

    我正在尝试将给定单元格的颜色设置为另一个单元格的颜色 该单元格已在模板中着色 但worksheet Cells row col Style Fill BackgroundColor似乎没有get财产 是否可以做到这一点 或者我是否必须在互联
  • char指针或char变量的默认值是什么[重复]

    这个问题在这里已经有答案了 下面是我尝试打印 char 变量和指针的默认值 值的代码 但无法在控制台上看到它 它是否有默认值或只是无法读取 ASCII 范围 include
  • 如何在内存中存储分子?

    我想将分子存储在内存中 这些可以是简单的分子 Methane CH4 C H bond length 108 7 pm H H angle 109 degrees But also more complex molecules like p
  • 方法参数内的变量赋值

    我刚刚发现 通过发现错误 你可以这样做 string s 3 int i int TryParse s hello out i returns false 使用赋值的返回值是否合法 Obviously i is but is this th
  • Bing 地图运行时错误 Windows 8.1

    当我运行带有 Bing Map 集成的 Windows 8 1 应用程序时 出现以下错误 Windows UI Xaml Markup XamlParseException 类型的异常 发生在 DistanceApp exe 中 但未在用户
  • 窗体最大化时自动缩放子控件

    有没有办法在最大化屏幕或更改分辨率时使 Windows 窗体上的所有内容自动缩放 我发现手动缩放它是正确的 但是当切换分辨率时我每次都必须更改它 this AutoScaleDimensions new System Drawing Siz
  • 为什么 strtok 会导致分段错误?

    为什么下面的代码给出了Seg 最后一行有问题吗 char m ReadName printf nRead String s n m Writes OK char token token strtok m 如前所述 读取字符串打印没有问题 但

随机推荐

  • go 中 for 循环构造与 range 关键字之间的区别

    考虑以下代码 它只打印所有 ENV 变量 package main import fmt os func main for i env range os Environ fmt Println i env 在这里 os Environ 应该
  • Chrome 未加载最新版本的 Web Worker 脚本(运行缓存版本)

    If I edit my web worker script and refresh the page the web worker script is a cached version I am reasonably confident
  • 在 iOS 中从所有 3 个麦克风进行录音

    据我了解 iPhone5 有 3 个独立的麦克风 参见here http www finalpointlogic com wp content uploads 2012 10 iPhone Mic jpg 是否可以同时从所有 3 个麦克风录
  • 上传与流星集合相关的图像

    我很难理解将图像上传到某个 Meteor 集合的整个过程 例如 belongs to 和 has one 与 Rails 的关联 我有一个投资组合项目集合 这是文件 PortfolioItems new Mongo Collection p
  • 将所有列从 int64 转换为 int32

    我们现在的问题是 更改 Pandas 中列的数据类型 https stackoverflow com questions 15891038 change data type of columns in pandas它真的很好解释了如何更改列
  • docker compose 覆盖 ports 属性而不是合并它

    我的 docker compose 配置如下所示 docker compose yml version 3 5 services nginx ports 8080 8080 docker compose prod yml version 3
  • Angular2-子组件中输入字段的模板驱动表单验证

    我正在努力添加template driven form validation在我的 angular2 应用程序中 我有一个叉子https plnkr co edit phhe74kAUmNZgNSmcsvm p preview https
  • PyInstaller不包含依赖文件

    我正在尝试在我的中创建一个 use PyInstallerproject https github com AJahJahRiddim md edit 这个项目使用weasyprint 但是当我运行pyinstaller时 它失败了 因为w
  • XHTML 1.0 过渡型与 XHTML 1.0 严格型?

    就 SEO 而言 从客户的角度来看 我应该使用 XHTML 1 0 Transitional 还是 XHTML 1 0 Strict 为什么有些人仍然使用 Transitional 如果我们使用过渡而不是严格 我们会失去一些东西吗 XHTM
  • 如何找到android TextView每行的字符数?

    所以我在android中有一个TextView 其宽度为屏幕的整个长度 填充为dip 5 如何计算屏幕上一行的字符数 我想换句话说 我正在尝试获取文本视图的列数 我考虑过根据文本大小和宽度进行手动计算 但是1 不知道相关性 2 由于填充以d
  • 如何更准确地绘制图表?

    我有一个数据集 其中包含1440 rows 297 columns 我试图绘制03 jan 2018就时间 X 轴 和密度 Y 轴 而言 但我遇到了一个问题 结果图不够清晰 X轴也没有出现 我想做像这样的东西 https i stack i
  • 如何拦截所有 Nancy 请求

    我看过这个帖子 南希 如何捕获所有请求 无论动词或路径如何 https stackoverflow com questions 17591494 nancy how do i capture all requests irrespectiv
  • Backbone.js - 从集合创建中获取 id

    我正在使用以下方法将模型添加到集合中create方法和 api 响应良好 模型似乎已正确返回并查看console dir resp 这就是我一直在寻找的东西 但是 当我尝试访问时runningorderid 哪一个是id定义为idAttri
  • jQuery 函数语法差异

    如何 function code jQuery 与 不同 document ready function 在jquery中 我知道什么是ready函数确实如此 它会等待 HTML 加载完毕后再开始 然而 确实 function 照着做 我知
  • 从远程 Git 存储库中删除所有文件和历史记录,而不删除存储库本身

    如果有人能告诉我如何删除 git 存储库上的每个文件 文件夹而不实际删除存储库本身 我将不胜感激 我也想删除与这些文件相关的所有历史记录 正如我所解释的这个答案 https stackoverflow com questions 18112
  • 将图像文件保存到临时目录

    我有一个名为 Image png 的图像文件 它保存在我的主包中 位于项目导航器层次结构中的 ViewController swift 文件旁边 我想将此图像的副本保存到临时目录 我以前没有做过 请问我可以使用什么代码 像这样的事情应该可以
  • scrapy 不打印异常的堆栈跟踪

    是否有一种特殊的机制来强制 scrapy 打印出所有 python 异常 堆栈跟踪 我犯了一个简单的错误 错误地获取了列表属性 导致 AttributeError 没有在日志中完整显示 出现的是 2015 11 15 22 13 50 sc
  • LinqKit 谓词生成器抛出 TypeLoadException?

    我在尝试执行使用 PredicateBuilder 动态构建的查询时遇到问题 我能够构建查询 但是在执行查询本身时 我得到以下 TypeLoadException 运行时 return context SearchRecords AsExp
  • 在Python中使用libclang解析C++

    经过一些研究和几个问题后 我最终探索了libclang https pypi python org pypi clang 3 5库以便在 Python 中解析 C 源文件 给定一个 C 源代码 int fac int n return n
  • 没有模板参数的模板类的容器

    我想知道您是否可以拥有一个包含具有不同模板参数的对象的容器 我正在努力实现这样的目标 include