gpt4 book ai didi

c++ - 使函数关于指针和引用通用

转载 作者:搜寻专家 更新时间:2023-10-31 00:53:17 24 4
gpt4 key购买 nike

假设我有这个 C++ 函数:

class C { ... };

void do(const vector<C>& cs) {
...
for (...) {
cs[i].do_whatever();
}
...
}

但是C复制起来很昂贵,所以我可能有这样的东西:

std::vector<C*> reorder_in_some_way(const std::vector<C>& cs) {
...
}

int main() {
std::vector<C> cs = ...;

std::vector<C*> reorderedCs = reorder_in_some_way(cs);

do(reorderedCs);
}

显然这行不通。我可以通过放弃并制作 do 来绕过它像这样任何类型的模板:

template<typename T>
void do(const vector<T>& cs) {

但它实际上只适用于 C的,我希望在类型系统中对其进行编码 - 而且它也使 do()如果您不必四处寻找使用它的地方,就更容易理解。

有没有办法写do()这样它通常可以同时使用 vector<C>vector<C*> (以及奖励积分 vector<reference_wrapper<C>> )?

最佳答案

只需编写 2 个应用仿函数的模板函数:

template<class T,typename Func>
void apply( const std::vector<T> &v, Func f )
{
for( const auto &i : v ) f( i );
}

template<class T,typename Func>
void apply( const std::vector<T*> &v, Func f )
{
for( auto i : v ) f( *i );
}

然后传递一个 lambda:

std::vector<C> vc;
std::vector<C*> vp;
auto call = []( const C &c ) { c.do_whatever(); };
apply( vc, call );
apply( vp, call );

(请注意,您不能调用您的函数 do - 它是 C++ 中的关键字)

live example

PS 正如您在评论中提到的,您的函数 apply 相当复杂,因此您更愿意只拥有它的一个拷贝,在本例中创建一个助手:

template<class T>
const T &apply_helper( const T *t ) { return *t; }

template<class T>
typename std::enable_if<!std::is_pointer<T>::value, const T &>::type
apply_helper( const T &t ) { return t; }

然后只编写一次apply函数:

template<class T,typename Func>
void apply( const std::vector<T> &v, Func f )
{
for( const auto &i : v ) f( apply_helper( i ) );
}

live example N2

关于c++ - 使函数关于指针和引用通用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49279021/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com