[英]Template argument for function type in C++
在这里, Wrapper::set
应该能够获取与int(int)
签名匹配的任何函数或函数对象,并将其存储到std::function
。 它应该与函数指针,lambdas,带有operator()
, std::bind
表达式等的对象一起使用。
#include <functional>
struct Wrapper {
using function_type = int(int);
std::function<function_type> func_;
template<typename Func> void set(Func func) { func_ = func; }
};
什么是最好的set
形式,以便它适用于所有情况? 即其中之一
set(Func func) { func_ = func; }
set(Func&& func) { func_ = std::forward<Func>(func); }
set(Func& func) { func_ = func; }
set(const Func& func) { func_ = func; }
最简单的版本:
void set(std::function<function_type> f) {
func_ = std::move(f);
}
复杂版本:
template <class F,
class = std::enable_if_t<std::is_assignable<std::function<function_type>&, F&&>::value>
>
void set(F&& f) {
func_ = std::forward<F>(f);
}
没有理由做任何其他事情。 这两个都优雅而正确地处理每个案例,简单的情况有一个额外的移动,对于std::function
并不是一个昂贵的操作,所以我更喜欢简单的版本,除非你有一个引人注目的,经过验证的性能要求需要复杂的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.