3 回答

TA貢獻1891條經(jīng)驗 獲得超3個贊
這是一個如何包裝std::function一個類的示例,該類檢查其構造函數(shù)參數(shù)的可調用性:
template<typename> struct check_function;
template<typename R, typename... Args>
struct check_function<R(Args...)>: public std::function<R(Args...)> {
template<typename T,
class = typename std::enable_if<
std::is_same<R, void>::value
|| std::is_convertible<
decltype(std::declval<T>()(std::declval<Args>()...)),
R>::value>::type>
check_function(T &&t): std::function<R(Args...)>(std::forward<T>(t)) { }
};
像這樣使用:
int a(check_function<int ()> f) { return f(); }
int a(check_function<int (int)> f) { return f(0); }
int x() { return 22; }
int y(int) { return 44; }
int main() {
a(x);
a(y);
}
請注意,這與函數(shù)簽名上的重載并不完全相同,因為它將可轉換參數(shù)(和返回)類型視為等效。對于確切的重載,這應該起作用:
template<typename> struct check_function_exact;
template<typename R, typename... Args>
struct check_function_exact<R(Args...)>: public std::function<R(Args...)> {
template<typename T,
class = typename std::enable_if<
std::is_convertible<T, R(*)(Args...)>::value>::type>
check_function_exact(T &&t): std::function<R(Args...)>(std::forward<T>(t)) { }
};
- 3 回答
- 0 關注
- 730 瀏覽
添加回答
舉報