簡體   English   中英

std :: enable_if參數是否為函數?

[英]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;
}

FuncintArgs為空,因此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 fargs

您編寫的代碼將始終為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中,只需使用decltypedeclval

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM