如何从 if 语句中获取类模板的实例? (C++)

2023-11-22

假设我有一个类模板,其中有一个成员pData,这是一个AxB任意类型的数组T.

template <class T> class X{ 
public:
    int A;
    int B;
    T** pData;
    X(int a,int b);
    ~X();        
    void print(); //function which prints pData to screen

};  
template<class T>X<T>::X(int a, int b){ //constructor
    A = a;
    B = b;
    pData = new T*[A];
    for(int i=0;i<A;i++)
        pData[i]= new T[B];
    //Fill pData with something of type T
}
int main(){
    //...
    std::cout<<"Give the primitive type of the array"<<std::endl;
    std::cin>>type;
    if(type=="int"){
        X<int> XArray(a,b);
    } else if(type=="char"){
        X<char> Xarray(a,b);
    } else {
        std::cout<<"Not a valid primitive type!";
    } // can be many more if statements.
    Xarray.print() //this doesn't work, as Xarray is out of scope.
}

由于实例 Xarray 是在 if 语句内部构造的,因此我无法在其他地方使用它。我尝试在 if 语句之前创建一个指针,但由于此时指针的类型未知,所以我没有成功。

处理此类问题的正确方法是什么?


这里的问题是X<int> and x<char>是完全不相关的类型。

事实上,它们都是同一个模板类的结果,这一点在这里没有帮助。

我可以看到几种解决方案,但这些取决于您真正需要的。

例如,您可以使X<>实例派生自公共非模板化基类,该基类具有print()方法(最终作为纯虚拟)。但在这样做之前,请确保它在功能层面上有意义:人们应该使用继承,因为它有意义,而不仅仅是因为技术限制。如果你这样做,你可能也会想要一个虚拟析构函数。

您还可以绑定并存储std::function<void ()>到您要调用的方法,但确保对象仍然“活动”(它们不在您当前的代码中:两个X<int> and X<char>当它们超出范围时,在您实际调用之前就被销毁print()).

最终的解决方案是制作一些与两者兼容的变体类型X<int> and X<char> (升压::变体可以在这里提供帮助)。然后您可以编写一个实现以下功能的访问者print()每种类型的功能。

选择最后一个解决方案,它会变成这样:

typedef boost::variant<X<int>, X<char>> genericX;

class print_visitor : public boost::static_visitor<void>
{
public:
    template <typename SomeType>
    void operator()(const SomeType& x) const
    {
        // Your print implementation
        // x is your underlying instance, either X<char> or X<int>.
        // You may also make several non-templated overloads of
        // this operator if you want to provide different implementations.
    }
};

int main()
{
  boost::optional<genericX> my_x;

  if (type=="int") {
    my_x = X<int>(a,b);
  } else if(type=="char") {
    my_x = X<char>(a,b);
  }

  // This calls the appropriate print.
  if (my_x) {
    boost::apply_visitor(print_visitor(), *my_x)
  }
}

我们实际上缺乏给出明确答案的知识:如果您的类是“实体”,那么您可能应该选择继承。如果它们更像“值类”,那么变体方式可能更适合。

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

如何从 if 语句中获取类模板的实例? (C++) 的相关文章

  • Tensorflow 中的自定义资源

    由于某些原因 我需要为 Tensorflow 实现自定义资源 我试图从查找表实现中获得灵感 如果我理解得好的话 我需要实现3个TF操作 创建我的资源 资源的初始化 例如 在查找表的情况下填充哈希表 执行查找 查找 查询步骤 为了促进实施 我
  • Mono 无法保存用户设置

    我在 Mono Ubuntu 上保存用户设置时遇到问题 这是代码示例 private void Form1 Load object sender EventArgs e string savedText Properties Setting
  • 当我单击 C# 中的“取消”按钮时重定向到新页面(Web 部分)

    Cancel button tc new TableCell btnCancel new Button btnCancel Text Cancel btnCancel Click new EventHandler btnCanel Clic
  • 在 OpenCL 中将函数作为参数传递

    是否可以在 OpenCL 1 2 中将函数指针传递给内核 我知道可以用C实现 但不知道如何在OpenCL的C中实现 编辑 我想做这篇文章中描述的同样的事情 在 C 中如何将函数作为参数传递 https stackoverflow com q
  • TextBox 焦点的 WinForms 事件?

    我想添加一个偶数TextBox当它有焦点时 我知道我可以用一个简单的方法来做到这一点textbox1 Focus并检查布尔值 但我不想那样做 我想这样做 this tGID Focus new System EventHandler thi
  • 调试内存不足异常

    在修复我制作的小型 ASP NET C Web 应用程序的错误时 我遇到了 OutOfMemoryException 没有关于在哪里查看的提示 因为这是一个编译时错误 如何诊断此异常 我假设这正是内存分析发挥作用的地方 有小费吗 Thank
  • ZLIB 解压缩

    我编写了一个小型应用程序 该应用程序应该解压缩以 gzip deflate 格式编码的数据 为了实现这一点 我使用 ZLIB 库 使用解压缩功能 问题是这个功能不起作用 换句话说 数据不是未压缩的 我在这里发布代码 int decompre
  • 如何在 VS 中键入时显示方法的完整文档?

    标题非常具有描述性 是否有任何扩展可以让我看到我正在输入的方法的完整文档 我想查看文档 因为我可以在对象浏览器中看到它 其中包含参数的描述和所有内容 而不仅仅是一些 摘要 当然可以选择查看所有覆盖 它可能是智能感知的一部分 或者我不知道它并
  • VS30063:您无权访问 https://dev.azure.com

    我正在尝试在 asp net core 2 1 mvc 应用程序中使用以下代码连接 Azure DevOps Uri orgUrl new Uri https dev azure com xxxxx String personalAcces
  • 如何用 kevent() 替换 select() 以获得更高的性能?

    来自Kqueue 维基百科页面 http en wikipedia org wiki Kqueue Kqueue 在内核和用户空间之间提供高效的输入和输出事件管道 因此 可以修改事件过滤器以及接收待处理事件 同时每次主事件循环迭代仅使用对
  • 在 C# 中将位从 ulong 复制到 long

    所以看来 NET 性能计数器类型 http msdn microsoft com en us library system diagnostics performancecounter aspx有一个恼人的问题 它暴露了long对于计数器
  • 两组点之间的最佳匹配

    I ve got two lists of points let s call them L1 P1 x1 y1 Pn xn yn and L2 P 1 x 1 y 1 P n x n y n 我的任务是找到它们点之间的最佳匹配 以最小化它
  • 事件日志写入错误

    很简单 我想向事件日志写入一些内容 protected override void OnStop TODO Add code here to perform any tear down necessary to stop your serv
  • 通过不同 DLL 或 EXE 中的指针或引用访问 STL 对象时发生访问冲突

    我在使用旧版 VC6 时遇到以下问题 我只是无法切换到现代编译器 因为我正在处理遗留代码库 http support microsoft com kb 172396 http support microsoft com kb 172396
  • 如何排列表格中的项目 - MVC3 视图 (Index.cshtml)

    我想使用 ASP NET MVC3 显示特定类型食品样本中存在的不同类型维生素的含量 如何在我的视图 Index cshtml 中显示它 an example 这些是我的代码 table tr th th foreach var m in
  • 在 C 中复制两个相邻字节的最快方法是什么?

    好吧 让我们从最明显的解决方案开始 memcpy Ptr const char a b 2 调用库函数的开销相当大 编译器有时不会优化它 我不会依赖编译器优化 但即使 GCC 很聪明 如果我将程序移植到带有垃圾编译器的更奇特的平台上 我也不
  • 32位PPC rlwinm指令

    我在理解上有点困难rlwinmPPC 汇编指令 旋转左字立即然后与掩码 我正在尝试反转函数的这一部分 rlwinm r3 r3 0 28 28 我已经知道什么了r3 is r3在本例中是一个 4 字节整数 但我不确定这条指令到底是什么rlw
  • 同时从多个流中捕获、最佳方法以及如何减少 CPU 使用率

    我目前正在编写一个应用程序 该应用程序将捕获大量 RTSP 流 在我的例子中为 12 个 并将其显示在 QT 小部件上 当我超过大约 6 7 个流时 问题就会出现 CPU 使用率激增并且出现明显的卡顿 我认为它不是 QT 绘制函数的原因是因
  • 如何查明CONFIG_FANOTIFY_ACCESS_PERMISSIONS是否启用?

    我想利用fanotify 7 http man7 org linux man pages man7 fanotify 7 html我遇到的问题是在某些内核上CONFIG FANOTIFY ACCESS PERMISSIONS不起作用 虽然C
  • Swagger 为 ASP.CORE 3 中的字典生成错误的 URL

    当从查询字符串中提取的模型将字典作为其属性之一时 Swagger 会生成不正确的 URL 如何告诉 Swagger 更改 URL 中字典的格式或手动定义输入参数模式而不自动生成 尝试使用 Swashbuckle 和 NSwag 控制器 pu

随机推荐

  • 在机械化中提交表格

    我在提交表单提交结果时遇到问题 我可以提交表单 但无法在第一个页面之后的页面上提交表单 I have browser mechanize Browser browser set handle robots False browser ope
  • 一项操作的两个快捷键

    我需要两个快捷方式来执行一项操作 Ctrl 1 or ctrl s 有什么办法可以做到这一点吗 或者我必须创建该操作的副本 然后为此操作分配第二个快捷方式 为了在一个操作上安装多个快捷方式 您可以使用QAction setShortcuts
  • 升级您的 Android Google 移动广告 SDK 以确保广告持续投放

    我今天收到这条消息 AdMob 发布商您好 7 月初 我们向 AdMob 发出了通知 拥有在 SDK 版本 6 4 1 及更低版本上运行应用程序的发布商 告知他们有关弃用 SDK 版本以及需要升级的信息 2016 年 9 月 15 日 对于
  • Excel VBA 英镑和冒号的含义?

    我试图理解一个带有井号和冒号符号的 vba 函数 VBA函数 kn 1 pn 1 y 1 我知道井号用于在 Excel VBA 中将变量声明为双精度型 然而 从上面那行来看 它似乎没有任何意义 上面的函数有什么作用呢 冒号 是语句分隔符 它
  • 计算上次 SQL 查询插入的行数

    我有这个查询 INSERT INTO db1 outbox DestinationNumber TextDecoded SELECT User CellPhone SMSMessage as TextDecoded FROM db2 Use
  • python 中是否有可用的缩放互补误差函数?

    在matlab中有一个特殊功能我所知道的任何 Python 集合中都没有它 numpy scipy mpmath 也许还有其他地方可以找到这样的功能 UPD对于所有认为这个问题微不足道的人 请首先尝试计算参数 30 的这个函数 UPD2任意
  • 是否有任何工具可以将托管 C++ 转换为 C++/CLI? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 目前不接受答案 我们有一个使用托管 C 语法编写的旧项目 我想向团队提出一种相当无痛的更新方法 我不介意一定程度的人机交互 我认为我的期望是现实的 我们仍然需要手工
  • 如何使用 WorksheetFunction.VLookup 处理 1004 错误?

    我有这个代码 Dim wsFunc As WorksheetFunction Set wsFunc Application WorksheetFunction Dim ws As Worksheet Set ws Sheets 2012 D
  • React + Redux 中的 Action 不会触发减速器

    我正在开发一个react redux应用程序 由于某种原因 我调用的操作没有到达reducer 我目前只有一个日志语句 我已附上我认为相关的代码 任何贡献将不胜感激 组件中函数内调用的操作 onSearchPressed console l
  • 在android中的对话框中设置多个文本框

    我正在创建一个对话框 它就像一个包含两个文本框和两个按钮的登录屏幕 我能够创建它 但我的问题是两个编辑文本框彼此重叠 第二个编辑文本框与第一个编辑文本框重叠 这可能是一个简单的问题 但由于我是 Android 新手 所以我一直坚持下去 请帮
  • Django,更新部分页面

    我正在尝试实现一个简单的代码测试服务器 客户将在网页上提交他们的代码 我们将使用两个测试用例运行它 可能需要几分钟 然后我们将发布结果 该页面将很简单 带有提交表单和输出框 我的问题是更新输出框 我正在寻找simplest实现输出框的方法
  • 使用 psutil 终止进程

    我正在编写一些代码 根据进程的名称和所有者来终止进程 这在 Windows XP 上运行良好 但当我在 Windows 7 上运行相同的代码时 在尝试获取进程的用户名时出现 访问被拒绝 错误 有没有更简单的方法来终止在 XP 和 Win7
  • 变分自动编码器:Keras 中的实现预热

    我最近读过这张纸它引入了一个称为 预热 WU 的过程 该过程包括将 KL 散度中的损失乘以一个变量 该变量的值取决于纪元数 从 0 到 1 线性演化 我想知道这是否是做到这一点的好方法 beta K variable value 0 0 d
  • 在第一次声明后将函数声明为默认函数

    In 8 4 2 Explicitly defaulted functions dcl fct def default 标准的 显式默认函数和隐式声明函数是 统称为默认函数 并且实现应 为它们提供隐式定义 12 1 12 4 12 8 这可
  • Azure Web Api - 每 4 分钟和 30 分钟等待一次 Sql 连接

    在 ApiController 上的请求中 我跟踪等待 Sql 连接打开的持续时间 await t TrackDependencyAsync async gt await sqlConnection OpenAsync return tru
  • PostgreSQL 日期范围未正确使用索引

    我有一个简单的表 其中有一个带有日期类型的 user birthday 字段 可以是 空值 CREATE TABLE users user id bigserial NOT NULL user email text NOT NULL use
  • org.springframework.context.ConfigurableApplicationContext 类型无法解析

    当我尝试在 Spring Tool Suite 中创建第一个应用程序时 出现以下错误 该行有多个标记 org springframework context ConfigurableApplicationContext 类型无法解析 这是
  • Rails:从列中选择唯一值

    我已经有了一个可行的解决方案 但我真的很想知道为什么这不起作用 ratings Model select rating uniq ratings each r puts r rating 它选择但不打印唯一值 而是打印所有值 包括重复项 它
  • 我可以在 C++ 中创建一个新运算符吗?如何创建?

    MATLAB 数组支持矩阵运算和元素运算 例如 M N and M N 这是区分两种不同操作的非常直观的方法 如果我想在C 中实现类似的操作 我该怎么做 我可以创建一个新的运算符吗 也 如果是 有人可以给我一些指导吗 不 你不能超载op C
  • 如何从 if 语句中获取类模板的实例? (C++)

    假设我有一个类模板 其中有一个成员pData 这是一个AxB任意类型的数组T template