gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:34:52 26 4
gpt4 key购买 nike

在这里,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 的最佳形式是什么?以便它适用于所有情况? 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com