2014-03-05 91 views
3

是否有可能在編譯時使用decltype(如果它是最好的方式來做到這一點,否則最好的辦法是做到這一點)確定並存儲返回類型SomeMethod存儲方法的返回類型和參數類型

是否也可以使用相同的工具來存儲參數SomeMethod的參數類型列表?

這個想法背後,是使他們很容易從外部使用getters類訪問。

class SomeClass 
{ 
public: 
    typedef [???] ProcRetType; 
    typedef [???] ProcArgTypeList; 

public: 
    SomeClass() { } 
    ~SomeClass() noexcept { } 

    SomeType SomeMethod(SomeType1 arg1, SomeType2 arg2) { } 

    // Data members 
private: 
}; 

回答

5

返回類型,你可以用decltype

typedef decltype(SomeMethod(std::declval<SomeType1>(), std::declval<SomeType2>())) ProcRetType; 

對於參數,你需要一個幫手特質。這也可用於返回類型,就像這樣:

template <class Func> 
struct Helper; 

template <class T, class R, class... Arg> 
struct Helper<R (T::*)(Arg...)> 
{ 
    typedef std::tuple<Arg...> ArgTypes; 
    typedef R ReturnType; 
}; 

,然後用它是這樣的:

typedef Helper<decltype(&SomeClass::SomeMethod)>::ReturnType ProcRetType; 
typedef Helper<decltype(&SomeClass::SomeMethod)>::ArgTypes ProcArgTypeList; 

我使用std::tuple代表類型列表 - 其他表示也是可能的如Boost.MPL

您可能需要提供Helper的幾個其他部分專業化以說明const函數(並且可能還有volatile以及舊式可變參數函數(如果適用於您)。

+0

感謝您的明確答案,以及不錯的技術。但是我得到以下錯誤:錯誤 - 'SomeClass'中沒有名爲'SomeMethod'的成員 錯誤 - 非好友類成員'ReturnType'不能具有限定名稱 錯誤 - typedef聲明符不能限定 Error - expected'; 「在聲明清單結尾處,這是我在這方面不理解的。 – Athanase

+2

'Helper <&SomeClass :: SomeMethod> :: ReturnType'看起來不對。應該可能是'Helper :: ReturnType'。 – Simple

+0

不錯的更正。但是,爲什麼我必須在'SomeClass'的'SomeMethod'聲明之後聲明我的'typedef'? – Athanase

1

可以代表類型與std::type_info對象(經由typeid operator構造的),並將其存儲與std::type_index

舉個例子,你可以這樣做:

auto ret_type = std::type_index(typeid(ProcRetType)); 

存儲ProcRetType在一個變量。

並且由於事實std::type_indexCopyConstructibleCopyAssignable,你也可以將它們存儲在容器,如std::vector。例如:

std::vector<std::type_index> vec; 
vec.emplace_back(typeid(int)); 
vec.emplace_back(typeid(double)); 
// ... 
+0

感謝您的回答。我沒有提到我想在編譯時做這件事。像'typedef decltype(SomeClass :: SomeMethod)ProcRetType;' – Athanase

相關問題