分类:函数对象、适配器 | 组件类型:类型 |
Mem_fun1_ref_t<Result, X, Arg>的构造函数采用某个X的成员函数之一的指针。然后,如同所有函数对象一样,mem_fun1_ref_t有一个operator(),允许mem_fun1_ref_t利用普通函数调用语法进行调用。在这种情况下,mem_fun1_ref_t的operator()接收两个参数;第一个类型为X,第二个类型为Arg.
如果F是mem_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)); }
参数 | 说明 | 默认值 |
---|---|---|
Result | 成员函数的返回类型。 | |
X | 成员函数的类mem_fun1_ref_t调用。 | |
Arg | 成员函数的参数类型。 |
成员 | 定义位置 | 说明 |
---|---|---|
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 | 见下文。 |
成员 | 说明 |
---|---|
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将在未来版本中删除。