类别:仿函数,适配器 | 组件类型:类型 |
mem_fun_ref_t<Result, X>的构造函数接受指向X的一个成员函数的指针。然后,与所有函数对象类似,mem_fun_ref_t有一个operator()允许mem_fun_ref_t通过普通函数调用语法调用。在此情况下,mem_fun_ref_t的operator()接受类型为X&.
的参数。如果F是mem_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)); }
参数 | 描述 | 默认值 |
---|---|---|
Result | 成员函数的返回类型。 | |
X | 调用成员函数所属的类。mem_fun_ref_t模型 |
成员 | 定义位置 | 描述 |
---|---|---|
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 | 请参阅以下内容。 |
成员 | 描述 |
---|---|
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.