2017-10-08 188 views
0

是否可以使用模板類指針來聲明模板函數?類似這樣的:C++ 11/14/17:模板類指針作爲模板參數

template <typename FirstType, typename ... TypesRemaining> 
class MyClass 
{ 
    // ... 
}; 

template <int n, template <typename FirstType, typename ... TypesRemaining> typename MyClass<FirstType, TypesRemaining...>::*ptr> myFunction() { 
    // ... 
} 

是否可以使用'using'來聲明指針類型?事情是這樣的:

template <typename FirstType, typename ... TypesRemaining> 
class MyClass 
{ 
    // ... 
}; 

template<typename FirstType, typename ... TypesRemaining> 
using ptrMyClass = MyClass<FirstType, TypesRemaining...>*; 

template <int n, template <typename FirstType, typename ... TypesRemaining> typename ptrMyClass<FirstType, TypesRemaining...> ptr> myFunction() { 
    // ... 
} 
+0

什麼,如果你正在嘗試做的問題這個? – user0042

+0

以上所有代碼都不能編譯。我不知道如何做正確的語法來實現相同的東西。 – Aesope

回答

1

你可以做這樣的事情(編譯罰款鏗鏘,使用gcc ICE):

template <typename FirstType, typename... TypesRemaining> 
class MyClass 
{ 
    // ... 
}; 

template<int n, auto ptr> class 
myFunction_impl; 

template 
< 
    int n 
, typename FirstType 
, typename... TypesRemaining 
, MyClass<FirstType, TypesRemaining...> * ptr 
> class 
myFunction_impl<n, ptr> 
{ 
    public: static void 
    impl(void) 
    { 
     // ... 
    } 
}; 

template<int n, auto ptr> auto 
myFunction(void) 
{ 
    return(myFunction_impl<n, ptr>::impl()); 
} 

int main() 
{ 
    myFunction<0, static_cast<MyClass<int, int, int> *>(nullptr)>(); 
    return 0; 
} 

Online compiler link

+0

感謝您的回答。我忘了說我被Visual Studio(至少2017年)困住了。我試圖編譯你的代碼,它不適用於VS.我收到myFunction_impl類的消息,說明模板聲明是「無法識別的模板聲明/定義」(我懷疑參數包不在最後)。另外,我想更好地理解您的解決方案。爲什麼你需要有一箇中級的實施?感謝你的寶貴時間。 – Aesope

+0

不幸的是VS還沒有對最新標準提供適當的支持。中級類的實現允許定義一個部分專業化推導'FirstType'和'TypesRemaining',這對於函數是不可能的。如果你真的不需要他們,那麼不需要中級班。 – VTT