这个operator()重载的例子清晰明了:
struct add_x {
add_x(int val) : x(val) {} // Constructor
int operator()(int y) const { return x + y; }
private:
int x;
};
add_x add42(42);
int i = add42(8);
assert(i == 50);
add_x add42(42)
定义一个将 42 设置为私有成员的仿函数,接下来int i = add42(8)
用 8 作为参数调用该仿函数。接下来operator()
将 42 和 8 相加并返回 50。非常棒。
然而,这个例子到底是如何工作的:
std::vector<int> v(10, 2);
// some code here
struct DivisibleBy
{
const int d;
DivisibleBy(int n) : d(n) {}
bool operator()(int n) const { return n % d == 0; }
};
if (std::any_of(v.cbegin(), v.cend(), DivisibleBy(7)))
std::cout << "At least one number is divisible by 7\n";
DivisibleBy(7)
DivisibleBy
创建一个7 设置为结构成员的实例。如何any_of()
意识到它必须传递向量值才能DivisibleBy
在此处用作谓词函数?这绝对有效:
if (std::any_of(v.cbegin(), v.cend(), [](int i) {
DivisibleBy db7 = DivisibleBy(7);
return db7(i);} ))
std::cout << "At least one number is divisible by 7\n";
我定义了一个带有显式int i
参数的内联谓词函数,该函数接收迭代器定义的值。但是,前一个示例 ( any_of(v.cbegin(), v.cend(), DivisibleBy(7))
) 没有参数来捕获迭代中的值。我假设这个
bool operator()(int n) const
是魔法发生的地方,但找不到任何明确的参考,它究竟是如何工作的?
该表达式
DivisibleBy(7)
创建一个临时对象,该对象被传递给std::any_of
. 这个对象的函数调用运算符照常被调用。它类似于: