分类:函数对象、适配器 | 元件类型:类型 |
Mem_fun1_t<结果、X、参数>的构造函数取一个指向之一的指针X的成员函数。然后,像所有函数对象一样,mem_fun1_t有一个operator()它允许mem_fun1_t使用普通函数调用语法调用。在这种情况下,mem_fun1_t的operator()取两个参数;第一个的类型为X*第二个的类型为参数.
如果F是一个mem_fun1_t,它构造为使用成员函数X::f,且如果x是一个类型为X*的指针,且a是一个类型为参数的值,则表达式F(x, a)相当于表达式x->f(a)。区别仅仅在于F可以传递给 STL 算法,其参数必须是函数对象。
Mem_fun1_t是成员函数适配器族中的一员。这些适配器在您希望将泛型编程与继承和多态结合时非常有用,因为在 C++ 中,多态涉及通过指针或引用调用成员函数。
与其他许多适配器一样,直接使用mem_fun1_t的构造函数通常不方便。通常,最好使用辅助函数mem_fun [2] 相反。
struct Operation { virtual double eval(double) = 0; }; struct Square : public Operation { double eval(double x) { return x * x; } }; struct Negate : public Operation { double eval(double x) { return -x; } }; int main() { vector<Operation*> operations; vector<double> operands; operations.push_back(new Square); operations.push_back(new Square); operations.push_back(new Negate); operations.push_back(new Negate); operations.push_back(new Square); operands.push_back(1); operands.push_back(2); operands.push_back(3); operands.push_back(4); operands.push_back(5); transform(operations.begin(), operations.end(), operands.begin(), ostream_iterator<double>(cout, "\n"), mem_fun(Operation::eval)); }
参数 | 描述 | 默认值 |
---|---|---|
结果 | 成员函数的返回类型。 | |
X | 成员函数所属的类mem_fun1_t调用。 | |
参数 | 成员函数的参数类型。 |
成员 | 定义位置 | 描述 |
---|---|---|
first_argument_type | 可适配二元函数 | 第一个参数的类型X* |
second_argument_type | 可适配二元函数 | 第二个参数的类型参数 |
result_type | 可适配二元函数 | 结果的类型结果 |
Result operator()(X* x, Arg a) const |
二元函数 | 函数调用运算符。调用x->f(a),其中f是传递给构造函数的成员函数。 |
explicit mem_fun1_t(Result (X::*f)(Arg)) |
mem_fun1_t | 见下文。 |
template <class Result, class X, class Arg> mem_fun1_t<Result, X, Arg> mem_fun(Result (X::*f)(Arg)); [2] |
mem_fun1_t | 见下文。 |
成员 | 描述 |
---|---|
explicit mem_fun1_t(Result (X::*f)(Arg)) |
构造函数。创建mem_fun1_t,它调用成员函数f. |
template <class Result, class X, class Arg> mem_fun1_t<Result, X, Arg> mem_fun(Result (X::*f)(Arg)); [2] |
如果f类型为Result (X::*)(Arg),则mem_fun(f)与mem_fun1_t<Result, X, Arg>(f)相同,但使用更方便。这是一个全局函数,而不是成员函数。 |
[1] 类型结果允许为void。也就是说,此适配器可以用于不返回值的函数。但这样做存在实现困难。根据 C++ 标准草案,可以通过编写void函数来返回return void而不是仅仅return。但目前(1998 年初),很少有编译器支持该特性。因此,作为替代方案,mem_fun1_t使用部分专门化来支持void成员函数。如果您的编译器尚未实现部分专门化,那么您将无法使用mem_fun1_t以及其返回值类型为void.
的成员函数[2]此帮助器函数在 C++ 标准草案中称为:mem_fun1,但在最终标准中称为:mem_fun。此实现同时提供这两个版本以保持向后兼容性,但mem_fun1将在未来版本中移除。