SGI

mem_fun_ref_t<Result, X>

类别:仿函数,适配器 组件类型:类型

描述

Mem_fun_ref_t是成员函数的适配器。如果X是某个具有成员函数类Result X::f()(即,不接受参数且返回类型为Result [1]的成员函数),那么mem_fun_ref_t<Result, X>f()作为普通函数(而非成员函数)调用。

mem_fun_ref_t<Result, X>的构造函数接受指向X的一个成员函数的指针。然后,与所有函数对象类似,mem_fun_ref_t有一个operator()允许mem_fun_ref_t通过普通函数调用语法调用。在此情况下,mem_fun_ref_toperator()接受类型为X&.

的参数。如果Fmem_fun_ref_t通过采用成员函数构建的X::f,如果x类型为X,则表达式F(x)等效于表达式x.f()。区别仅仅在于F可传递给参数必须是函数对象的 STL 算法。

Mem_fun_ref_t属于成员函数适配器系列的一种。如果你想将泛型编程与继承和多态性结合,这些适配器会很有用,原因在于,在 C++ 中,多态性涉及使用指针或引用来调用成员函数。事实上,mem_fun_ref_t通常不像mem_fun_t那样有用。两者的区别在于mem_fun_t的参数是指向对象的指针,而mem_fun_ref_t的参数是对对象的引用。引用(与指针不同)不能存储在 STL 容器中:指针本身是对象,而引用则仅仅是别名。

与其他许多适配器一样,直接使用mem_fun_ref_t的构造函数通常不方便。通常最好使用辅助函数mem_fun_ref。相反。

示例

struct B {
  virtual void print() = 0;
};

struct D1 : public B {
  void print() { cout << "I'm a D1" << endl; }
};

struct D2 : public B {
  void print() { cout << "I'm a D2" << endl; }
};

int main()
{
  vector<D1> V;

  V.push_back(D1());
  V.push_back(D1());

  for_each(V.begin(), V.end(), mem_fun_ref(B::print));
}

定义

在标准头文件 functional 和非标准向后兼容性标头文件 function.h 中定义。

模板参数

参数 描述 默认值
Result 成员函数的返回类型。  
X 调用成员函数所属的类。mem_fun_ref_t模型  

可适应一元函数

类型要求

至少具有一个不接受参数且返回类型为

公共基类

unary_function<X, Result>

成员

成员 定义位置 描述
argument_type 类型要求 参数的类型X
result_type 类型要求 结果的类型Result
Result operator()(X& x) const
一元函数 函数调用运算符。调用x.f()其中f是传递给构造函数的成员函数。
explicit mem_fun_ref_t(Result (X::*f)())
mem_fun_ref_t 请参阅以下内容。
template <class Result, class X>
mem_fun_ref_t<Result, X>
mem_fun_ref(Result (X::*f)());
mem_fun_ref_t 请参阅以下内容。

新成员

这些成员未在可适应单元函数条件中定义,但特定于mem_fun_ref_t.
成员 描述
explicit mem_fun_ref_t(Result (X::*f)())
构造函数。创建mem_fun_ref_t调用成员函数f.
template <class Result, class X>
mem_fun_ref_t<Result, X>
mem_fun_ref(Result (X::*f)());
的参数。如果f类型为Result (X::*)()然后mem_fun_ref(f)与以下内容相同mem_fun_ref_t<Result, X>(f)但更方便。这是一个全局函数,而不是成员函数。

注释

[1]类型Result允许为void。即,此适配器可用于不返回值的函数。但是,这会遇到实施难题。根据 C++ 草案标准,可以通过编写void函数返回return void而不是仅返回的内容return。然而,目前(1998 年初)非常少量的编译器支持该功能。因此,作为一个替代方案,mem_fun_ref_t使用部分专门化来支持void成员函数。如果您的编译器尚未实施部分专门化,那么您将无法使用mem_fun_ref_t带有返回类型为

的成员函数 void.

另请参阅

mem_fun_t, mem_fun1_t, mem_fun1_ref_t
[Silicon Surf] [STL Home]
版权所有 © 1999 Silicon Graphics, Inc.保留所有权利。 TrademarkInformation