我試圖設計一個C++宏,必須是這個樣子:如何在lambda變量中使用decltype而不捕獲它?
#define MY_MACRO(OBJECT, METHOD) \
[](BaseClass* obj) \
{ \
return static_cast<decltype(OBJECT)>(obj)->METHOD();\
}
基本上,轉換成調用給定對象上的給定方法的拉姆達的宏。但lambda需要將對象的基類作爲參數(我的用例保證了轉換將始終工作)。此外,要調用的方法可能不在基類上。
該宏的用法是,我有我不能修改聲明爲另一種方法:
void Foo(std::function<int(BaseClass*)>);
,我需要能夠使用我的宏作爲像這樣的參數來調用它:
T x;
Foo(MY_MACRO(x, method)); // match std::function<int(T*)>
但是,宏代碼不起作用,因爲我沒有捕獲OBJECT,所以它不在範圍內,當我需要將它傳遞給decltype時。從概念上講,編譯器需要的所有信息都在那裏......我該怎麼做?可能嗎?
一些限制:
- 拉姆達的參數需要BaseClass的。我不能讓它decltype(OBJECT)。
- 我的情況不允許我捕獲OBJECT。
- 我無法訪問通用lambda捕獲的C++ 14功能。
你有沒有考慮過'std :: mem_fn'? –
是的,我已經嘗試過,但我無法在我的情況下使用它。我正在概括我的問題陳述;事實上,這不是那麼簡單。但底線是它需要是一個lambda,我需要訪問對象的類型而不捕獲它。 –
您可以添加一個用法示例,僅用於說明嗎? –