void print(int i) { std::cout << i << std::endl; }
...
std::vector<int> vec;
// Fill vec
// Using a functor
Accumulator acc;
std::for_each(vec.begin(), vec.end(), acc);
// acc.counter contains the sum of all elements of the vector
// Using a function pointer
std::for_each(vec.begin(), vec.end(), print); // prints all elements
因为 T 要求有一个名为 write 的成员函数,该函数接受任何对 const char * (或者更确切地说,const char [])隐式可转换的内容。本例中的 Reporter 类没有这个类,因此将 T (一个模板参数)作为 Reporter 将无法编译。
然而,就我目前所见,这种方法适用于不同的类型
T t;
t("Hello world");
尽管如此,它仍然明确要求类型 T 有这样一个操作符定义,所以我们仍然对 T 有一个要求。就个人而言,我不认为函数太奇怪,因为它们是常用的,但我宁愿看到这种行为的其他机制。在 C # 这样的语言中,你可以直接传入一个委托。我不太熟悉 C + + 中的成员函数指针,但是我可以想象你也可以在那里实现同样的行为。
struct A {
int t = 0;
int operator()(int i) { return t += i; } // must have return type or void
};
int main() {
A a;
cout << a(3); // 3
cout << a(4); // 7 (Not 4 bcos it maintaines state!!!)
}
2. 用户自定义转换功能:
struct A {
int t = 3;
operator int() { return t; } // user-defined conversion function
// Return type is NOT needed (incl. void)
};
int main() {
cout << A(); // 3 - converts the object{i:3} into integer 3
A a;
cout << a; // 3 - converts the object{i:3} into integer 3
}