【发布时间】:2015-01-28 23:23:22
【问题描述】:
问题:如果不是因为它无法编译,以下代码将非常具有表达力和简洁性,即使不一定很快。
它无法编译,因为您无法将 std::function 实例与 operator==() 进行比较。而 std::find() 试图做到这一点。
当然,我可以采用完全不同的实现方式,但我固执己见,喜欢下面的代码,我正在寻找“尽可能接近”的东西。
谁能给我一个漂亮的重写下面的代码来做同样的事情?
#include <functional>
#include <vector>
typedef std::function<bool(int)> Tester_t;
typedef std::vector<Tester_t> TesterSet_t;
bool Test(TesterSet_t &candidates, int foo)
{
TesterSet_t dropouts;
for( auto& tester : candidates )
{
if(!tester(foo))
{
droputs.push_back(tester);
}
}
while(!dropouts.empty())
{
// The following line is not compiling because std::function has no operator==()
TesterSet_t::iterator culprit =
std::find( candidates.begin(), candidates.end(), dropouts.back() );
candidates.erase(culprit);
dropouts.pop_back();
}
return !candidates.empty();
}
【问题讨论】:
-
您能描述一下您要解决的潜在问题吗?
std::function没有==运算符的原因是因为以这种方式比较函数没有多大意义。你怎么可能确定两个函数是否相等? -
简短回答:您应该创建一个包含唯一键和
std::function的结构,并拥有这些结构的向量。实际使用std::function作为搜索键没有多大意义。 See here -
我敲开了这段代码 sn-p 这样我就不必用更长的代码打扰任何人了- 你用一些输入来面对它,你只想让那些仍然“在游戏中”的候选人留在身边。正如你所说, std::function 没有意义;)
-
@MattMcNabb 如果这里没有人有更好的主意,我会这样做。