在这里, Wrapper::set 应该能够获取与 int(int) 签名匹配的任何函数或函数对象,并将其存储到 std::function 中。它应该适用于函数指针、lambda、带有 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 的最佳形式是什么,以便它适用于所有情况? IE。之一
  • 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);
    }
    

    没有理由做任何其他事情。这两种方法都能优雅而正确地处理每种情况,简单的情况有一个额外的 Action ,对于 std::function 来说,这不是一项昂贵的操作,所以我强烈喜欢简单的版本,除非您有一个引人注目的、经过验证的性能要求来需要复杂的.

    关于c++ - C++ 中函数类型的模板参数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39373678/

    10-17 01:40