std::一个向量/映射中的函数变量参数 如何在C++中使用这两个独立的持有者? typedef std::function<void(int a, int b)> f1; typedef std::function<void(int a)> f2; std::vector<f1> m; void add(f1 f) { m.push_back(f); } void add(f2 f) { // add one more (unused) parameter to f2 so we can add f2 to f1 vector holder? } typedef std::函数f1; typedef std::函数f2; std::向量m; 无效添加(f1 f) { m、 推回(f); } 无效添加(f2 f) { //在f2中再添加一个(未使用的)参数,以便我们可以将f2添加到f1向量保持器? }

std::一个向量/映射中的函数变量参数 如何在C++中使用这两个独立的持有者? typedef std::function<void(int a, int b)> f1; typedef std::function<void(int a)> f2; std::vector<f1> m; void add(f1 f) { m.push_back(f); } void add(f2 f) { // add one more (unused) parameter to f2 so we can add f2 to f1 vector holder? } typedef std::函数f1; typedef std::函数f2; std::向量m; 无效添加(f1 f) { m、 推回(f); } 无效添加(f2 f) { //在f2中再添加一个(未使用的)参数,以便我们可以将f2添加到f1向量保持器? },c++,c++11,c++14,std-function,C++,C++11,C++14,Std Function,我们可以通过某种方式重载f1函数以包含不同的参数集吗? 现在可以用可变模板或类似的方法解决这个问题吗?创建一个与新签名匹配的新lambda,并添加它: void add(f2 f) { m.push_back( [g = std::move(f)](int a, int /* unused */){ g(a); } ); } 这将std::function封装在lambda中,该lambda忽略任何额外的参数: template<class R, class...Args>

我们可以通过某种方式重载f1函数以包含不同的参数集吗?
现在可以用可变模板或类似的方法解决这个问题吗?

创建一个与新签名匹配的新lambda,并添加它:

void add(f2 f)
{
    m.push_back( [g = std::move(f)](int a, int /* unused */){ g(a); } );
}

这将
std::function
封装在lambda中,该lambda忽略任何额外的参数:

template<class R, class...Args>
auto ignore_extra_args( std::function<R(Args...)> f ) {
  return [f = std::move(f)](Args...args, auto&&...)->R{
    return f(std::forward<Args>(args)...);
  };
}
这样可以节省可能的开销

template<class F, decltype(std::declval<F const&>()(1,1))* =nullptr>
void add(F&& f) {
  m.push_back(std::forward<F>(f));
}

template<class F, class...Unused>
void add(F&& f, Unused&&...) {
  add( ignore_extra_args<void(int)>(std::forward<F>(f)) );
}
模板
无效添加(F&&F){
m、 向后推(标准:向前推(f));
}
模板
无效添加(F&F,未使用的&&…){
添加(忽略额外参数(std::forward(f));
}

可能重复已经三次接近票数的投票,重复的投票与当前问题正好相反。我会让第二个参数
自动&&/*未使用*/
我自己。
template<class F, decltype(std::declval<F const&>()(1,1))* =nullptr>
void add(F&& f) {
  m.push_back(std::forward<F>(f));
}

template<class F, class...Unused>
void add(F&& f, Unused&&...) {
  add( ignore_extra_args<void(int)>(std::forward<F>(f)) );
}