C++ 中接受“任何内容”的模板

2023-11-23

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

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<Field<void*>>,但这似乎是一个糟糕的解决方案......有更好的方法吗?


有几件事...

  • C++11(自从你谈论以来你似乎已经拥有了std::initializer_list) 确实有类型化的可变参数,特别是它们被命名为可变参数模板

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

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

如果您的编译器支持可变参数模板(并非所有编译器都支持),您始终可以使用它,但是stashing对于完全通用的方法来说,向量中后面的字段可能有点复杂,除非您使用类型擦除。 (再说一遍,要解决的问题是什么?可能有更简单的解决方案......)

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

C++ 中接受“任何内容”的模板 的相关文章

随机推荐