簡體   English   中英

返回指向成員函數的指針(沒有typedef)

[英]Returning pointer-to-member-function (without typedefs)

在C ++ 03上編譯時,我試圖編寫一個測試模板函數,它返回一個返回int的成員函數的指向成員函數的函數,並獲取兩個float參數:

template<typename TemplateClass>
int (TemplateClass::*)(float,float) Testtest(TemplateClass &A)
{
    return &TemplateClass::Function;
}

但很自然,無論我使用的指向成員函數的語法有什么變化,編譯器都會抱怨初始化錯誤。 Typedef,雖然它適用於已知的類,但由於顯而易見的原因(命名沖突),不會接受我不能提前知道可能使用相同函數的類的模板類參數。

有什么非typedef方法可以讓這個函數編譯並返回一個指向成員函數的指針?

要聲明它沒有類型別名,沒有類型推導,並且沒有尾隨返回類型:

template<typename TemplateClass>
int (TemplateClass::* Testtest(TemplateClass &A))(float,float)

但當然這不是你在實際代碼中使用的。 相反,您將使用別名模板

template<typename T>
using return_type = int (T::*)(float,float);

template<typename TemplateClass>
return_type<TemplateClass> Testtest(TemplateClass &A)

或者在C ++ 14中返回類型推導:

template<typename TemplateClass>
auto Testtest(TemplateClass &A)

或者是尾隨返回類型(在C ++ 11中):

template<typename TemplateClass>
auto Testtest(TemplateClass &A) -> int (TemplateClass::*)(float,float)

你需要這個原型:

template<typename TemplateClass>
int (TemplateClass::*Testtest(TemplateClass &A)) (float,float) { }
  int (Class::*f())(float,float);

f是不帶參數的函數返回指向類Class takinf 2浮點數並返回int的成員函數的指針。

和模板版本:

         template <typename Type>
         int (Type::*f())(float,float);

我拒絕你的問題的前提。 使用typedef。 或者,具體來說,是一種類型特征:

template <class T, class F>
struct make_mem_fun {
    typedef F T::*type;
};

template<typename TemplateClass>
typename make_mem_fun<TemplateClass, int(float, float)>::type
Testtest(TemplateClass &A)
{
    return &TemplateClass::Function;
}

這比實際返回類型的復雜語法更容易理解。 使用C ++ 11,我們可以將其轉換為別名以刪除typename ::type內容。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM