我有两个函数可以处理Clazz类型的对象,它们之间唯一的区别就是我访问其成员的方式:
void foo(vector<Clazz*>& v) {
...
v[0]->method();
...
}
void foo(vector<Clazz>& v) {
...
v[0].method();
...
}
将不使用v的代码外包并编写简单的包装函数是不可能/不实际的。我可以简单地将一个矢量类型转换为另一个矢量类型并将新矢量传递给函数的一个标准化版本,但我需要一个支持这两种变体的快速解决方案。
有没有办法合并这两个函数并仍保留两种输入类型的灵活性?
答案 0 :(得分:4)
是。这就是模板功能的用途。
你必须以某种方式抽象出“你[访问他们的成员的方式”]。也许通过一个额外的模板lambda参数,它提供了一种访问成员的抽象方法。或者,也许是通过辅助超载。
Clazz &gimme(Clazz &c) { return c; }
Clazz &gimme(Clazz *c) { return *c; }
然后,让你的模板功能:
template<typename vector_t> void foo(vector_t & v)
...调用gimme(v[n])
访问向量中的每个成员。