C++允許非類型模板參數爲指針,包括函數指針,類型。我最近問了一個question這是什麼對我有用,這是一個跟進到one of the answers。有沒有辦法推導一個函數指針模板參數的值?
是否可以從函數指針中推斷函數指針模板參數的值?例如:
using VoidFunction = void(*)();
template <VoidFunction F>
void templ(VoidFunction);
...
void func(); // a VoidFunction
...
templ<func>(func); // works, but I have to specify the template parameter explicitly
templ(func); // <-- I would like to be able to do this
有沒有辦法讓這種扣除發生?從編譯器實現者的角度來看,在技術上似乎是可行的,只要函數參數可以在編譯時解析爲代碼中的函數即可。
如果您想知道背後的動機,請參閱this answer下的意見,特別是對std::bind()
實施的可能優化。
編輯:我意識到我可以簡單地刪除函數參數並使用模板參數,如templ<func>()
。我在函數參數中添加的唯一目的是試圖避免必須傳遞模板參數。
我想我真正想要的,是要還推導出函數指針的類型,如:
template <typename Function, Function F>
void templ(/* something */);
,然後能夠調用
templ(func);
或
templ<func>();
並且具有類型和值從單一提及函數指針。
希望現在更有意義。
完整模板參數列表,它怎麼能演繹呢?例如,我可以這樣做:'template void foo(std :: size_t i){int arr [N];/* fill */return arr [i];}'。如果我在碰巧可以完成這個演繹時偶然忘記模板參數,我肯定會想要一個錯誤。 –
chris
想一想,我不確定我是否理解爲什麼它需要作爲函數參數傳遞。不是'templ();'夠了嗎? –
chris
@chris:對,我的問題沒有多少意義,請參閱我的編輯。 – HighCommander4