当前位置: 首页 > 知识库问答 >
问题:

C++中接受“任何东西”的模板

王刚毅
2023-03-14

我有一个简单的模板结构将字符串与值关联起来

template<typename T> struct Field
{
    std::string name; T self;
}

我有一个函数,我希望接受1个或多个任何类型的字段,这些字段可能是不同的类型,所以我使用std::initializer_list,因为据我所知,C++缺少类型化变量参数,不能确定变量参数的大小,并且必须至少有一个其他参数来确定从哪里开始。

问题是我不知道如何告诉它接受可能是不同类型的字段。在Java中,我只使用foo(field bar,field ...baz),但是C++缺少类型化变量参数和通配符。我唯一的另一个想法是使参数类型为std::initializer_list > ,但这似乎是一个糟糕的解决方案...有没有更好的方法做这件事?

共有1个答案

习淇
2023-03-14

几件事...

>

  • C++11(因为您正在讨论std::initializer_list)确实有类型化的变量参数,特别是它们被命名为变量模板

    Java泛型和C++模板是完全不同的野兽。Java泛型创建单个类型,该类型存储对对象的引用,并提供对接口中类型的自动转换,但重要的一点是它执行类型擦除。

    我建议您解释您想要解决的问题,并在C++中获得解决问题的建议。如果您想真正模仿Java中的行为(我不能坚持认为Java是一种不同的语言,有不同的习惯用法),您可以手动使用C++中的类型擦除(即使用boost::any)。但我很少觉得有必要在程序中进行全类型擦除...使用variant类型(Boost::variant)更为常见。

    如果您的编译器支持可变模板(不是所有编译器都支持),您可以随时使用它,但是对于完全泛型的方法来说,将字段存储在向量中可能有点复杂,除非您使用类型擦除。(再说一遍,要解决的问题是什么?可能有更简单的解决方案……)

  •  类似资料:
    • 我是不是漏了什么? 这不能编译。Eclipse抱怨"Matcher Asrett类型中的方法断言(T, Matcher)不适用于参数(int, Matcher 我错过了什么东西可以用吗?我在过去使用过其他Hamcrest方法...那么这有什么不同呢?

    • 问题内容: 我一直在努力围绕Go中接口的概念。 唯一让我感到不适的是语法。看下面的例子: 我的问题是。基于一个接口实例实际上拥有一个指向实际数据的指针引用这一事实,我觉得这样做很自然。通常,在不使用时分配非指针将创建数据的完整内存副本,但是在分配给接口时,这似乎避开了它,而是 简单地(在幕后)将指针分配给接口值。 我对吗? 也就是说,用于的数据会不会复制到内存中? 问题答案: 的数据 将 被复制。

    • 问题内容: 我在将任何内核模块构建到我的机器上时遇到问题。每当我构建模块时,modpost总是说模块为零: 为了解决该问题,我编写了一个测试模块(hello.c): 这是模块的Makefile: 在计算机上构建它时,得到以下输出: 当我在另一台机器上制作模块时,它成功了: 我寻找了有关modpost的任何相关文档,但收效甚微。任何人都知道modpost如何决定要构建什么?我可能会缺少一个环境吗?

    • 问题内容: 我有以下代码: 该文件包含以下内容: 但是由于某种原因,每次都只返回一个空列表。 代码中可能存在愚蠢的错误或错字,但我只是找不到。提前致谢。 问题答案: 你读的文件 已经 和文件指针不是在 末尾 的文件。然后调用将不会返回数据。 仅读取一次文件: 另一种选择是在重新阅读之前先回到开头: 但这只是浪费CPU和I / O时间。 最好的办法是尝试和阅读 小 数据量,或寻求到了最后,通过采取文

    • 问题内容: 我正在尝试将用c ++编写的并行排序包装为模板,以将其与任何数字类型的numpy数组一起使用。我正在尝试使用Cython来做到这一点。 我的问题是我不知道如何将指向正确类型的numpy数组数据的指针传递给C ++模板。我相信我应该为此使用融合dtypes,但是我不太了解如何使用。 .pyx文件中的代码如下 过去,我对所有可能的dtype进行了丑陋的for循环处理,但我相信应该有更好的方

    • 我正试图装配一个KafkaStorm“你好世界”系统。我有Kafka安装和运行,当我发送数据与Kafka生产者我可以读取它与Kafka控制台消费者。 我从O'Reilly的《Storm入门》一书中选取了第二章的例子,并将其修改为使用Kafka斯库特(KafkaSpout)而不是普通的喷口。 当我运行应用程序时,kafka中的数据已经挂起,KafkaSpout的下一个线程不会收到任何消息——它进入,