[英]How to overload operator ->* in C++
有沒有辦法重載->*
用於類似智能指針的對象? 以下是我想做的事情。 為簡單起見,我不使用模板(一旦我將它用於單個固定類,我就會得到它)。 我可以使用指向數據成員的指針,但我似乎無法正確指向成員函數。 目前,我願意解決一個僅適用於成員函數(而不適用於數據成員)的重載。 我甚至願意接受一個只接受指向成員函數指針的重載,只有一個固定的原型(比如void func()
)。
struct MyObject
{
void MyMethod() {}
};
struct MySmartPtr {
MyObject *p;
// What should the prototype and function body be?
// ??? operator->*(????) { ???? }
};
void MyFunc()
{
MyObject obj;
MySmartPtr obj_ptr;
obj_ptr.p = &obj;
void (MyObject::* member_func_ptr)() = &MyObject::MyMethod;
// Now call obj.MyMethod() through the "smart pointer"
(obj_ptr->*member_func_ptr)();
}
請不要給我解決方法(例如,重載*
和do (*obj_ptr.*member_func_ptr)()
)。 我想->*
按照代碼段中的說明工作。
看看Scott Meyers 撰寫的這篇文章 。 它已經很老了,但是唯一討論重載的資源->*
我知道的。
請注意,標准庫的迭代器和智能指針類型不會重載->*
。 我不知道原因,但我懷疑這是因為操作員很少使用,實現起來很麻煩,而且很容易解決。 無論如何,由於標准庫不支持它,您的用戶也不會期望它也能工作。
#include <stdio.h>
struct OBJ {
typedef void (OBJ::*Met)(void);
void met( void ) {
printf( "Method call!\n" );
}
};
struct POBJ {
OBJ* p;
typedef void (*fun)(void);
static void nop( void ) {}
fun operator->*( OBJ::Met m ) {
printf( "operator ->* !\n" );
// return fun(p->*m); // works in gcc
(p->*m)();
return nop;
}
};
int main( void ) {
OBJ obj;
OBJ* pobj = &obj;
POBJ p; p.p = &obj;
OBJ::Met met = &OBJ::met;
(pobj->*met)();
(p->*met)();
}
有關原型,請參見http://en.wikipedia.org/wiki/Operators_in_C_and_C%2B%2B
我將用C ++ 0x:變量模板,綁定和函數給它一個鏡頭。 我想應該可以將它移植到boost:
#include <iostream>
#include <functional>
struct S
{
void f()
{
std::cout << __PRETTY_FUNCTION__ << std::endl;
}
};
template<class C>
struct PMFSmartPtr
{
C *p;
template<typename C1, typename R, typename... P>
std::function<R(P...)> operator->*(R (C1::*pmf)(P...))
{
std::cout << __PRETTY_FUNCTION__ << std::endl;
return(std::function<R(P...)>(std::bind(pmf, p)));
}
};
int main()
{
PMFSmartPtr<S> x;
void (S::*pmf)() = &S::f;
(x->*pmf)();
return(0);
}
嘗試使用g ++ 4.4.4並適用於不帶任何參數的函數,1參數成員函數編譯失敗但我不知道這是我的錯誤還是編譯器或libstdc ++問題...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.