访问类中的值类似于 boost::any

2024-02-15

我正在做一个简单的boost::any-类似用于教育目的的课程,但我不知道如何访问存储的值。我可以完美地设置该值,但是当我尝试访问“holder”类中的任何成员时,编译器只是抱怨在它派生的类中找不到该成员。我无法将成员声明为virtual因为模板。

这是相关代码:

class Element
{
    struct ValueStorageBase
    {
    };

    template <typename Datatype>
    struct ValueStorage: public ValueStorageBase
    {
        Datatype Value;

        ValueStorage(Datatype InitialValue)
        {
            Value = InitialValue;
        }
    };

    ValueStorageBase* StoredValue;

public:

    template <typename Datatype>
    Element(Datatype InitialValue)
    {
        StoredValue = new ValueStorage<Datatype>(InitialValue);
    }

    template <typename Datatype>
    Datatype Get()
    {
        return StoredValue->Value; // Error: "struct Element::ValueStorageBase" has no member named "Value."
    }
};

将虚拟函数添加到模板中很好 - 只是函数本身不能是模板。模板化的类或结构仍然可以有虚函数。你需要使用dynamic_cast的魔力。

class Element
{
    struct ValueStorageBase
    {
        virtual ~ValueStorageBase() {}
    };

    template <typename Datatype>
    struct ValueStorage: public ValueStorageBase
    {
        Datatype Value;

        ValueStorage(Datatype InitialValue)
        {
            Value = InitialValue;
        }
    };

    ValueStorageBase* StoredValue;

public:

    template <typename Datatype>
    Element(Datatype InitialValue)
    {
        StoredValue = new ValueStorage<Datatype>(InitialValue);
    }

    template <typename Datatype>
    Datatype Get()
    {
        if(ValueStorage<DataType>* ptr = dynamic_cast<ValueStorage<DataType>*>(StoredValue)) {
            return ptr->Value;
        else
            throw std::runtime_error("Incorrect type!"); // Error: "struct Element::ValueStorageBase" has no member named "Value."
    }
};

如果你改变 Get 返回一个Datatype*你可以返回NULL而不是扔。你也没有处理过之前值的内存StoredValue,但我将其留给你。

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

访问类中的值类似于 boost::any 的相关文章

  • Nullable 是不可能的,为什么不呢? [复制]

    这个问题在这里已经有答案了 如果这是一个愚蠢的问题 请原谅 我正在尝试更好地理解 Net 中的 Nullable 类型 从我从 Microsoft 源代码 使用 ReSharper 中注意到的内容 我了解到 Nullable 是一个结构 而
  • 通过另一个列表更新列表(linq)

    我有类 Data 的对象列表 如下所示 class Data int code string name DateTime date update 我还有另一个课程列表 例如 class RefCodes int old code int n
  • 从另一个 FORM 中取回隐藏的 FORM

    我有两种形式Form1 and Form2 我正在打开Form2 from Form1 on button Click Form2 obj2 new Form2 this Visible false obj2 Show 然后我想回来Form
  • C# 和月历,选择多个日期

    我正在制作一个程序 可以帮助人们用 C 为某个部门 预订 订单 他们需要能够选择不同月份的多个日期 我更愿意拥有它 这样他们就可以单击一个日期 然后按住 Shift 键单击另一个日期以选择这两个日期之间的所有日期 并控制单击以进行单选 取消
  • .pdbs 会减慢发布应用程序的速度吗?

    如果 dll 中包含 pdb 程序调试 文件 则行号将出现在引发的任何异常的堆栈跟踪中 这会影响应用程序的性能吗 这个问题与发布与调试 即优化 无关 这是关于拥有 pdb 文件的性能影响 每次抛出异常时都会读取 pdb 文件吗 加载程序集时
  • 为什么 C# 中同一类型的隐式和显式运算符不能共存? [复制]

    这个问题在这里已经有答案了 为什么同一类中两个相同类型的运算符 显式和隐式 不能共存 假设我有以下内容 public class Fahrenheit public float Degrees get set public Fahrenhe
  • Nhibernate:连接表并从其他表获取单列

    我有以下表格 create table Users Id uniqueidentifier primary key InfoId uniqueidentifier not null unique Password nvarchar 255
  • PrivateObject 找不到属性

    我的结构基本上如下所示 abstract class A protected string Identificator get set private void DoSomething DoSomethingSpecific protect
  • 关闭整数的最右边设置位

    我只需要关闭最右边的设置位即可 我的方法是找到最右边位的位置 然后离开该位 我编写这段代码是为了这样做 int POS int n int p 0 while n if n 2 0 p else break n n 2 return p i
  • 如何在新窗口中打开图像或pdf文件?

    我有一个 gridview 它包含文件名和文件路径 图像和 pdf 格式文件 其中我使用了模板字段 在该字段下放置了 1 个图像按钮 单击该图像按钮 即 查看 按钮 时 我想在新窗口中打开所选文件 这是我的代码 protected void
  • 从点云检测平面集

    我有一组点云 我想测试3D房间中是否有角落 所以我想讨论一下我的方法 以及在速度方面是否有更好的方法 因为我想在手机上测试它 我将尝试使用霍夫变换来检测线 然后我将尝试查看是否有三条线相交 并且它们也形成了两个相交的平面 如果点云数据来自深
  • 在 C 语言中替换宏内的宏

    我正在尝试使代码部分可重用 我下面的评论片段没有达到我想要的效果 define NAME ABC define LOG SIZE NAME LEN 我想LOG SIZE决心ABC LEN 我尝试过使用 但没能让它发挥作用 LOG SIZE在
  • 是否可以在Linux上将C转换为asm而不链接libc?

    测试平台为Linux 32位 但也欢迎 Windows 32 位上的某些解决方案 这是一个c代码片段 int a 0 printf d n a 如果我使用 gcc 生成汇编代码 gcc S test c 然后我会得到 movl 0 28 e
  • 将 2 个字节转换为整数

    我收到一个 2 个字节的端口号 最低有效字节在前 我想将其转换为整数 以便我可以使用它 我做了这个 char buf 2 Where the received bytes are char port 2 port 0 buf 1 port
  • 测验;这个编译了吗?如果是的话它会返回什么(我知道答案)

    我最近发现这个错字 if name find string npos 显然开发者的意思是输入 if name find string npos 但令我惊讶的是发现错误甚至编译 Wall Werror 没有尝试过 pedantic 那么 咖啡
  • 在 mvc4 中创建通用 mvc 视图

    我以前也提过类似的问题 没有得到答案 如何创建一个通用的 mvc4 视图 该视图可以显示传递给它的模型列表或单个模型 模型可以是个人 组织或团体 无论传递给它的是什么 如果您正在寻找类似的东西 model MyViewModel
  • C++ 模板可以提供 N 个给定类的公共父类吗?

    我正在寻找一个 C 模板 它可以找到一组给定类的共同父级 例如 class Animal class Mammal public Animal class Fish public Animal class Cat public Mammal
  • WPF DataGrid - 在每行末尾添加按钮

    我想在数据网格的每一行的末尾添加一个按钮 我找到了以下 xaml 但它将按钮添加到开头 有人知道如何在所有数据绑定列之后添加它吗 这会将按钮添加到开头而不是末尾
  • 运行 xunit 测试时无法将输出打印到控制台窗口

    public class test2InAnotherProject private readonly ITestOutputHelper output public test2InAnotherProject ITestOutputHel
  • 如何在c中断言两个类型相等?

    在 C 中如何断言两种类型相等 在 C 中 我会使用 std is same 但搜索 StackOverflow 和其他地方似乎只能给出 C 和 C 的结果 在C中没有办法做到这一点吗 请注意 这不是询问变量是否具有某种类型 而是询问两个类

随机推荐

  • Proguard 错误:参数号 12 中的未知选项“(”

    我无法使用 proguard 导出我的项目 我收到此错误并且没有解决方案 我不知道第 12 号参数在哪里 2013 05 14 17 38 39 LiveWallpaper Proguard returned with error code
  • Redux Form、Radio Button Fields、如何支持变量值?

    在我的 React Redux 表单中 我有以下内容 fieldset legend Radio buttons legend this props job titles map jobTitle gt div div fieldset
  • HTTP 状态 500 - 未找到提供程序 org.glassfish.json.JsonProviderImpl

    我在用netbeans 8 jdk 7 tomcat 8 05 我创建了一个网络应用程序netbeans并添加了javax jsonapi 到我的项目 代码显示没有错误 但是当我运行我的 servlet 时 出现以下错误 HTTP Stat
  • webpack-dev-server 代理到 docker 容器

    我有 2 个使用 docker compose 管理的 docker 容器 似乎无法正确使用 webpack 来代理某些请求到后端 api docker compose yml version 2 services web build co
  • 如何与 python 的子进程作为连续会话进行交互

    我需要在 python 中实现一个过滤器 它从 Linux 命令行字典工具中挑选出特定的输出 我需要 从文件中获取一组单词 查找每个单词 1 如果单词不包含 则跳过它 2 else 如果是动词 则保存定义 为了测试代码 我写了两个pytho
  • 尝试运行 org.hibernate.tool.ant.EnversHibernateToolTask​​ 时遇到很多绊脚石

    我正在尝试按照建议运行 org hibernate tool ant EnversHibernateToolTask恩弗斯的相当简洁的指南 http www jboss org envers downloads 表的第二行 文档有 PDF
  • Macos Catalina 更新后出现错误:无法运行 colorls

    更新至 macOSCatalina打开终端时出错 ERROR Can t find Ruby library file or shared library colorls usage dirname path Users varunsukh
  • 仅使用公式即可获取当前文化以进行本地化

    有没有办法使用 Excel 中的公式确定当前系统区域性不使用任何VBA代码 我想象这样简单的事情 IF CULTURE sk SK Preh ad Overview 或者类似的事情也适合我 IF CURRENCYSIGN Preh ad O
  • 仅备份 SQL 架构?

    我需要创建 SQL Server 2005 数据库的备份 该数据库只有结构 没有记录 只有架构 有什么办法可以做到这一点吗 编辑 我正在尝试创建一个备份文件以与旧进程一起使用 因此脚本无法满足我的目的 抱歉 使用 3 步流程 从工作数据库生
  • 通过网站从 PHP 服务器下载文件 [关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 我有物理文件 希望用户在我的网站上下载 这些文件位于 C xampp htdocs myfile uploads 我需要一个 PHP 脚本
  • 撤消 git Push 到 Assembla

    所以 今天我想做一件好事并重新排列我的存储库中的文件 致力于并推动我的Assembla存储库 由于我没有使用 git moving 命令 所有文件都丢失了历史记录 我意识到自己的错误 并希望摆脱不必要的改变 以便之后可以采取正确的行动 我尝
  • 将 Java-Pair-Rdd 转换为 Rdd

    我需要将 Java pair rdd 转换为 csv 所以我想将其转换为rdd 来解决我的问题 我想要的是改变我的rdd 从 Key Value Jack a b c to Key value Jack a Jack b Jack c 我认
  • 如何在ElasticSearch中不进行分析?

    我不想分析 ElasticSearch 字段中的一个字段 即 e 应逐字保存和比较 这些值将包含字母 数字 空格 破折号 斜杠以及可能的其他字符 如果我没有在该字段的映射中提供分析器 则默认情况下仍使用分词器将我的逐字字符串分解为单词块 我
  • 在 Ruby 中删除“@”符号及其后面的所有内容

    我正在开发一个应用程序 我需要将用户电子邮件地址中 符号之前的任何内容作为他 她的名字和姓氏传递 例如 如果用户有电子邮件地址 电子邮件受保护 cdn cgi l email protection 比当用户提交表单时我从电子邮件中删除 ex
  • Typescript - 导入 Express 不起作用

    我的应用程序中有这个 types express已安装依赖项 import express require express 它指向的是express并说this is an unexpected identifier当我运行我的服务器时 我
  • Memcached 守护进程是否可以在不终止进程的情况下释放未使用的内存?

    我相信您不能强制正在运行的 Memcached 实例取消分配内存 除非终止该 Memcached 实例 并释放它所持有的所有内存 有谁知道一份明确的文档 甚至是来自可靠来源的邮件列表或博客文章 可以证实或否认这种印象 据我了解 Memcac
  • Tkinter tkFileDialog 不存在[重复]

    这个问题在这里已经有答案了 我正在尝试使用 Python 中的 Tkinter 显示打开的文件对话框 我发现的每个示例似乎都很容易使用 但它们都以以下行开头 import tkFileDialog 这行代码给我抛出了一个错误 说 No mo
  • MVC3 - 编译的 Razor 视图找不到 _ViewStart

    我在单独的类库中使用编译的 Razor 视图作为 MVC3 的一种插件系统 我遵循 Chris Van De Steed 的指南here http www chrisvandesteeg nl 2010 11 22 embedding pr
  • 如何使用 bin/www 为node.js heroku 部署编写Procfile?

    我正在尝试部署 Heroku 应用程序 我相信 procfile 可能是我的应用程序未部署的原因 我尝试了多种解决方案 包括 网络 节点 bin www 网络 npm 启动 我的应用程序无法运行可能还有另一个原因 但我想确保我的 Procf
  • 访问类中的值类似于 boost::any

    我正在做一个简单的boost any 类似用于教育目的的课程 但我不知道如何访问存储的值 我可以完美地设置该值 但是当我尝试访问 holder 类中的任何成员时 编译器只是抱怨在它派生的类中找不到该成员 我无法将成员声明为virtual因为