2014-12-07 86 views
3

我採取了以下struct檢索類的成員變量:模板和類型名稱語法

template<typename...T> 
class pack{}; 

template<typename...T> 
struct getArgs{}; 
template<typename C,typename R,typename...Args> 
struct getArgs<R(C::*)(Args...)>{using Type=pack<Args...>;}; 

但我不確定的語法來使用它。

如果我有一個類func1定義爲:

template<typename T> 
struct func1{ 
    constexpr T operator()(T x){return x+1;} 
}; 

我希望typename getArgs<typename func1<int>::operator()>::Type等同於pack<int>但我的模板參數不斷得到拒絕爲無效。

所以typename getArgs<typename some_class<class_template_args>::member_function>::Type 似乎不是正確的語法。任何幫助?謝謝!

編輯:我會非常想不實例化func1類的一個對象,並已經成功這樣做,因爲我已經創建等功能...

例如typename getN<1,pack<float,int> >::Type x;作品float x; 其中

template<std::size_t N,typename T,typename...Args> 
struct getN_help:getN_help<N-1,Args...>{}; 
template<typename T,typename...Args> 
struct getN_help<1,T,Args...>{using Type=T;}; 


template<std::size_t N,typename T> 
struct getN; 
template<std::size_t N,typename T,typename...Args> 
struct getN<N,pack<T,Args...> >{ 
    using Type=pack<typename getN_help<N,T,Args...>::Type>; 
}; 
+0

'參數...'是函數接受的類型包嗎? – 2014-12-07 18:05:14

+0

是的,沒錯。 – dumb0 2014-12-07 18:10:49

+0

好的,你有'func1 ''operator()'帶一個'T'。您還是不假定可調用的模板參數與可調用函數接受的類型相同? – 2014-12-07 18:18:02

回答

1

在此行中:

getArgs<typename func1<int>::operator()>::Type 

typename func1<int>::operator()不是一個類型,它是一個函數。你需要在指向它的指針上調用decltype()。使用operator&得到指向會員的指針:

getArgs<decltype(&func1<int>::operator())>::Type 
+0

我現在有另一個錯誤:在'typename getArgs :: operator())> :: Type y;'g ++抱怨說「類型「不會命名一個類型。 – dumb0 2014-12-07 18:40:51

+0

@ dumb0 [該代碼適用於我](http://coliru.stacked-crooked.com/a/19b189f8271c1a30)。你的樣子是什麼? – 0x499602D2 2014-12-07 18:45:21

+0

絕對是編譯失敗:http://coliru.stacked-crooked.com/a/a21cfab5fe72b673/main.cpp'test.cpp:在函數'int main()'中: test.cpp:16:55:error: 'type'in'struct getArgs :: *)(int)const>'沒有指定類型 typename getArgs :: operator())> :: Type z;' – dumb0 2014-12-07 18:52:37