gpt4 book ai didi

C++ 将函数对象作为左值和/或右值传递

转载 作者:太空狗 更新时间:2023-10-29 20:08:55 25 4
gpt4 key购买 nike

我有一个类应该根据用户提供的谓词过滤其内容。我得到的接口(interface)规定引用谓词:

class Test {
vector<int> data;
public:
template <class PREDTYPE>
void filter(PREDTYPE& pred) {
return;
}
};

还给了我一段测试代码,大致是这样的:

class Filter {
public:
bool operator()(int) const {
return false;
}
};

int main() {
Test test;
test.filter(Filter());
}

这不会编译,表示无法将“Filter&”类型的非常量左值引用绑定(bind)到“Filter”类型的右值。如果我将测试代码更改为

int main() {
Test test;
Filter filter;
test.filter(filter);
}

它有效,但这取决于最终用户,我无法控制他们的行为。我尝试重载 filter 方法,创建一个版本,该版本将按值接受谓词,然后通过引用传递它,但这也不会编译,消息 call of overloaded 'filter(Filter&)' is ambiguous

因此我的问题是:是否可以构造一个过滤器来接受谓词的右值和左值?

最佳答案

简而言之,是的,它是 (C++11)

您只需要依靠引用折叠规则来确保这一点:

template <typename PREDTYPE>
void filter(PREDTYPE&& pred) { // notice the &&
// ... Whatever
// Use perfect forwarding *IF* you can
std::forward<PREDTYPE>(pred)(some_stuff);
// Do not use pred after it has been forwarded!
}

这将接受右值和左值,而不必依赖 const- 引用(因此您的谓词仍然可以是可变的)。如果您坚持使用旧的 C++ 标准,最好的办法是改用 const 引用(上面突出显示警告)或将您的过滤器嵌入 std::function 并依赖于隐式转换调用站点。

关于C++ 将函数对象作为左值和/或右值传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51187685/

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