繁体   English   中英

C ++中函数类型的模板参数

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM