函数参数:vector<Clazz*>& vs vector<Clazz>&

Function argument: vector<Clazz*>& vs vector<Clazz>&

本文关键字:gt Clazz lt vector vs 参数 函数      更新时间:2023-10-16

我有两个函数作用于Clazz类型的对象,它们之间唯一的区别是我访问其成员的方式:

void foo(vector<Clazz*>& v) {
    ...
    v[0]->method();
    ...
}
void foo(vector<Clazz>& v) {
    ...
    v[0].method();
    ...
}

将不使用v的代码外包并编写一个简单的包装器函数是不可能/不可行的。我可以简单地在循环中将一种向量类型转换为另一种,并将新向量传递给函数的一个标准化版本,但我需要一个支持这两种变体的快速解决方案。

有没有一种方法可以合并这两个函数,同时保持两种输入类型的灵活性?

是。这就是模板函数的作用。

你将不得不以某种方式抽象出"你访问他们成员的方式"。也许是通过一个额外的模板lambda参数,该参数提供了访问成员的抽象方法。或者,也许是通过一个助手过载。

Clazz &gimme(Clazz &c) { return c; }
Clazz &gimme(Clazz *c) { return *c; }

然后,有你的模板功能:

template<typename vector_t> void foo(vector_t & v)

调用CCD_ 1来访问向量中的每个成员。