作者热门文章
- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我有一个类应该根据用户提供的谓词过滤其内容。我得到的接口(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/
C++ 新手,从事个人项目,但在使用 vector 列表通过引用传递时遇到问题。 我需要一个可以调用的函数来将用户添加到用户的运行 vector 列表中。其中第一个参数是我要添加到的列表(通过引用),
我是一名优秀的程序员,十分优秀!