[英]Determining return type of std::function
我正在編寫一個接收std::function
對象的模板函數(通過使用正確的參數調用std::bind
生成)。 在這個函數中,我想確定這個函數對象的返回類型。 有可能嗎?
事實上,我希望模板函數返回相同的類型。 你能想到一個優雅的,基於標准的,實現這一目標的方式嗎?
就像是:
template <typename T>
T::return_type functionObjWrapper(T functionObject) {
// ...
return functionObject();
}
謝謝
您可以使用decltype
和尾隨返回類型來執行此decltype
:
template <typename T>
auto functionObjWrapper(T functionObject) -> decltype(functionObject()) {
// ...
return functionObject();
}
您正在尋找std::function<F>::result_type
即
template <typename F>
typename std::function<F>::result_type
functionObjWrapper(std::function<F> functionObject) {
// ...
return functionObject();
}
需要std::function<F>::result_type
之前的typename
,因為這是一個依賴類型名稱。
template <class F>
std::result_of_t<F&()> functionObjWrapper(F functionObject) {
// ...
return functionObject();
}
std::result_of
采用“看起來像函數調用”的類型表達式。 然后它會告訴您如果使用該可調用類型和那些參數執行函數調用會發生什么。
如果缺少C ++ 14,請將std::result_of_t<?>
替換為typename std::result_of<?>::type
,或者編寫自己的:
template<class Sig>
using result_of_t=typename std::result_of<Sig>::type;
在許多C ++ 11實現中, result_of
甚至是SFINAE友好的。
我做F&()
而不是F()
因為我們將使用F
類型的非const左值來進行調用。 如果您的最后一行是std::move(functionObject)()
或std::forward<F>(functionObject)()
,那么您將執行result_of_t<F()>
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.