SGI

mem_fun1_ref_t<Result, X, Arg>

分类:函数对象、适配器 组件类型:类型

说明

Mem_fun1_ref_t是成员函数的适配器。如果X是某个包含具有成员函数的类的Result X::f(Arg)(即接受一个类型为Arg参数并返回一个类型为Result [1])的值的成员函数,则mem_fun1_ref_t<Result, X, Arg>是一个函数对象适配器,可使您调用f就像调用普通函数而不是成员函数一样。

Mem_fun1_ref_t<Result, X, Arg>的构造函数采用某个X的成员函数之一的指针。然后,如同所有函数对象一样,mem_fun1_ref_t有一个operator(),允许mem_fun1_ref_t利用普通函数调用语法进行调用。在这种情况下,mem_fun1_ref_toperator()接收两个参数;第一个类型为X,第二个类型为Arg.

如果Fmem_fun1_ref_t,构建其以使用成员函数X::f,并且如果x是类型为X并且a是类型为Arg的值,则表达式F(x, a)相当于表达式x.f(a)。差异仅在于F可传送给其参数必须是要函数对象的 STL 算法。

Mem_fun1_ref_t是成员函数适配器系列中的一个。如果您想结合通用编程与继承和多态,这些适配器很有用,因为在 C++ 中,多态涉及通过指针或引用来调用成员函数。然而实际上,mem_fun1_ref_t通常不如mem_fun1_t有用。两者的区别在于mem_fun1_t的第一个参数是对象的指针,而mem_fun1_ref_t的参数是对象的引用。引用与指针不同,不能存储在 STL 容器中:指针本身是对象,但引用仅仅是别名。

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

示例

给定一个矢量矢量,从每个矢量中提取一个元素。
int main() {
  int A1[5] = {1, 2, 3, 4, 5};
  int A2[5] = {1, 1, 2, 3, 5};
  int A3[5] = {1, 4, 1, 5, 9};

  vector<vector<int> > V;
  V.push_back(vector<int>(A1, A1 + 5));
  V.push_back(vector<int>(A2, A2 + 5));
  V.push_back(vector<int>(A3, A3 + 5));

  int indices[3] = {0, 2, 4};

  int& (vector<int>::*extract)(vector<int>::size_type);
  extract = vector<int>::operator[];
  transform(V.begin(), V.end(), indices,
            ostream_iterator<int>(cout, "\n"),
            mem_fun_ref(extract));
}

定义

定义在标准标头 functional 中,以及在非标准向后兼容标头 function.h 中。

模板参数

参数 说明 默认值
Result 成员函数的返回类型。  
X 成员函数的类mem_fun1_ref_t调用。  
Arg 成员函数的参数类型。  

模型

可调整二进制函数

类型要求

公用基类

binary_function<X, Arg, Result>

成员

成员 定义位置 说明
first_argument_type 可调整二进制函数 第一个参数的类型X
second_argument_type 可调整二进制函数 第二个参数的类型Arg
result_type 可调整二进制函数 结果的类型Result
Result operator()(X& x, Arg a) const
二元函数 函数调用操作符。调用x.f(a)其中f是传递给构造函数的成员函数。
explicit mem_fun1_ref_t(Result (X::*f)(Arg))
mem_fun1_ref_t 见下文。
template <class Result, class X, class Arg>
mem_fun1_ref_t<Result, X, Arg>
mem_fun_ref(Result (X::*f)(Arg)); [2]
mem_fun1_ref_t 见下文。

新成员

这些成员未在可适应二元函数需求中定义,但特定于mem_fun1_ref_t.
成员 说明
explicit mem_fun1_ref_t(Result (X::*f)(Arg))
构造函数。创建一个mem_fun1_ref_t调用成员函数f.
template <class Result, class X, class Arg>
mem_fun1_ref_t<Result, X, Arg>
mem_fun1_ref(Result (X::*f)(Arg)); [2]
如果f类型为Result (X::*)(Arg)mem_fun_ref(f)mem_fun1_ref_t<Result, X, Arg>(f)相同,但更方便。这是一个全局函数,而不是成员函数。

备注

[1] 类型Result允许为void。也就是说,此适配器可用于不返回值的函数。但这样做存在实现困难。根据 C++ 草案标准,可以通过编写void函数返回return void而不是仅return。然而,目前(1998 年初),极少编译器支持该功能。作为替代方案,mem_fun1_ref_t使用部分专门化来支持void成员函数。如果您的编译器尚未实现部分专门化,那么您将无法使用mem_fun1_ref_t,其成员函数的返回类型为void.

[2] 此帮助器函数在 C++ 标准草案中称为mem_fun1_ref但在最终标准中称为mem_fun_ref。此实现为向后兼容性提供这两个版本,但mem_fun1_ref将在未来版本中删除。

另请参阅

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