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
類型(這是使什麼,如果支票)你要去
給它打電話還是做別的事? 'is_invocable'對前者有好處,可以用'void_t'或其他方法很容易地模擬出來。 – chris
您可以使用此答案的變體來獲取函數具有的參數數http://stackoverflow.com/a/9065203/390557 – wreckgar23
@chris我打算在'do_something()'函數中調用它。 'is_invocable'將如何幫助解決這種情況?我傳遞給'is_invocable'的參數類型是什麼? – Curious