[英]std::enable_if an argument is a function?
為什么以下代碼在C ++ 11下編譯? (我知道它不會鏈接。)我希望std::enable_if
測試失敗,因為1()
不是函數類型。
#include <type_traits>
template <typename Func, typename... Args>
typename std::enable_if<std::is_function<Func(Args...)>::value>::type
delegate(Func, Args...);
int main(void) {
delegate(1); // << Why does this line compile?
return 0;
}
Func
為int
, Args
為空,因此Func(Args...)
為int()
,即“ ()
返回int
函數”。
is_function
返回true的任何內容都不能是按值函數參數的類型,因此您要執行的操作並不明顯。
我試圖讓委托僅在
Func
是可以應用於Args...
的函數(最好是函數指針)時才可調用Args...
為此使用表達式SFINAE。
template <typename Func, typename... Args>
auto delegate(Func f, Args... args) -> decltype(f(args...), void());
根據您實際想要執行的操作,您可能想要std::move
f
和args
。
您編寫的代碼將始終為true。 您可能是說std::is_function<Func>...
雖然不確定,但似乎根本不需要enable_if
,最好還是簡單地
template <class R, class... ARGS>
R delegate2(R (*fun)(ARGS...), ARGS...);
但是,如果我錯了,並且enable_if
是您成功的關鍵,請按以下步驟進行操作:
#include <type_traits>
template <typename Func, typename... Args>
typename std::enable_if<std::is_function<std::remove_pointer_t<Func>>::value>::type
delegate(Func, Args...);
void check(int);
int main(void) {
delegate(check, 10); // << good line compiles
delegate(10); // << this bad line does not
return 0;
}
基於此評論:
我試圖讓委托僅在
Func
是可以應用於Args...
的函數(最好是函數指針)時才可調用Args...
您使用了錯誤的類型特征。 要檢查Func
是否可通過Args...
調用,您需要構造一個表達式,該表達式實際上將使用這些參數調用Func
的實例。 為此,有std::result_of_t
(在C ++ 14中,它變得對SFINAE友好):
template <typename Func, typename... Args,
class R = std::result_of_t<Func(Args...)>>
R delegate(Func, Args...);
或者,在C ++ 11中,只需使用decltype
和declval
:
template <typename Func, typename... Args,
class R = std::declval<Func>()(std::declval<Args>()...)>
R delegate(Func, Args...);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.