2017-04-01 57 views
2

我想檢查是否傳遞的函數參數是一元或沒有,像這樣檢查一個函數模板是一元的

template <typename Func> 
using EnableIfUnary = std::enable_if_t<std::is_same< 
    decltype(std::declval<Func>()(std::declval<const int&>())), 
    decltype(std::declval<Func>()(std::declval<const int&>()))>::value>; 

template <typename Func, EnableIfUnary<Func>* = nullptr> 
void do_something(Func func) { ... } 

// and use like so 
template <typename Type> 
void foo(Type) { cout << "foo(Type)" << endl; } 
template <typename Type> 
void bar(Type) { typename Type::something{}; } 

int main() { 
    do_something(foo); 
    return 0; 
} 

是否有更好的方法來檢查,如果一個函數是一元?我的當前方法不起作用時,功能通過(在我的例子中foo())使用該類型的方式不會與int s。

在上述情況下foo是法律和酒吧不大,因爲沒有命名的東西在int類型(這是使什麼,如果支票)你要去

+0

給它打電話還是做別的事? 'is_invocable'對前者有好處,可以用'void_t'或其他方法很容易地模擬出來。 – chris

+0

您可以使用此答案的變體來獲取函數具有的參數數http://stackoverflow.com/a/9065203/390557 – wreckgar23

+0

@chris我打算在'do_something()'函數中調用它。 'is_invocable'將如何幫助解決這種情況?我傳遞給'is_invocable'的參數類型是什麼? – Curious

回答

0
template<typename...> 
struct is_unary_function : std::false_type {}; 

template<typename T, typename R> 
struct is_unary_function<R(*)(T)> : std::true_type {}; 

Live Demo

+0

OP使用函數模板,我懷疑目的是檢查它是否只有一個模板參數。這不起作用,除非它明確地專門化了函數模板,並使用'is_unary_function'專用。而且,問題中定義的'bar'的專業化將是無效的,代碼不會被編譯。 – skypjack