std::function 中的模板参数

Template parameter in std::function


我有这段代码,但我不明白为什么不起作用。
在编译期间,在我调用 运行() 的行中,我得到:
Candidate template ignored: could not match 'function<double (const type-parameter-0-0 &, const type-parameter-0-0 &)>' against 'double (*)(const data_t &, const data_t &)'

这是代码:

struct data_t {
  double value1;
  double value2;
};

double scoreValue1(const data_t & a, const data_t & b) { return a.value1 - b.value1; }
double scoreValue2(const data_t & a, const data_t & b) { return a.value2 * b.value2; }

template <class T>
void run(const std::vector<T> & dataA, const std::vector<T> & dataB, std::function<double(const T &, const T &)> function) {
  
  double value = 0;
  
  for(size_t i=0; i<dataA.size(); ++i)
    value += function(dataA[i], dataB[i]);
  
    std::cout << value << std::endl;
    
}

int main(int argc, const char * argv[]) {

  std::vector<data_t> dataA;
  std::vector<data_t> dataB;

  run(dataA, dataB, scoreValue1);
  run(dataA, dataB, scoreValue2);

  return 0;
  
}

函数 run 的第三个参数被声明为 std::function<double(const T &, const T &)>,但是您将指针传递给 scoreValue1 导致无法进行类型推导。为了处理这个问题,你需要

  1. 将参数声明为指向函数的指针
void run
(
    const std::vector<T> & dataA
,   const std::vector<T> & dataB
,   double (* function )(const T & a, const T & b)
)

online compiler

  1. 将第三个参数的 T 放入不可推导的上下文中:
void run
(
    const std::vector<T> & dataA
,   const std::vector<T> & dataB
,   std::function<double(const ::std::type_identity_t<T> &, const ::std::type_identity_t<T> &)> function
)

online compiler