我有一个简单的模板结构,将字符串与值关联起来
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++ 惯用的问题解决方案建议。如果你想真正模仿 Java 中的行为(我不能坚持认为 Java 是一种不同的语言并且具有不同的习惯用法),你可以在 C++ 中使用类型擦除manually(即使用boost::any
)。但我很少觉得需要在程序中进行完全类型擦除......使用变体类型(boost::variant
) 更常见一些。
如果您的编译器支持可变参数模板(并非所有编译器都支持),您始终可以使用它,但是stashing对于完全通用的方法来说,向量中后面的字段可能有点复杂,除非您使用类型擦除。 (再说一遍,要解决的问题是什么?可能有更简单的解决方案......)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)