Mat*_*t G 7 c++ templates wildcard variadic c++11
我有一个简单的模板结构,将字符串与值相关联
template<typename T> struct Field
{
std::string name; T self;
}
Run Code Online (Sandbox Code Playgroud)
我有一个函数,我想接受任何类型的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中的行为(我不能坚持使用不同的语言并且有不同的习语),你可以手动使用C++中的类型擦除(即使用boost::any).但我很少觉得在程序中需要完全类型擦除...使用变体类型(boost::variant)更常见.
如果你的编译器提供了可变参数模板支持(并非所有的编译器一样),你可以随时与发挥,但积攒的字段后面的载体可以是有点复杂了完全通用的方法,除非你使用的类型擦除.(再次,要解决的问题是什么?可能有更简单的解决方案...)
Mar*_*ein -1
这对于 C++ 来说不是很惯用。也许可以做到;Coplien 的书可能有一些想法。但 C++ 是强类型的,因为它相信类型;尝试将其变成 Smalltalk 或像野鸡一样折叠它可能会导致流泪。
| 归档时间: |
|
| 查看次数: |
4759 次 |
| 最近记录: |