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
导致无法进行类型推导。为了处理这个问题,你需要
- 将参数声明为指向函数的指针
void run
(
const std::vector<T> & dataA
, const std::vector<T> & dataB
, double (* function )(const T & a, const T & b)
)
- 将第三个参数的
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
)
我有这段代码,但我不明白为什么不起作用。
在编译期间,在我调用 运行() 的行中,我得到:
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
导致无法进行类型推导。为了处理这个问题,你需要
- 将参数声明为指向函数的指针
void run
(
const std::vector<T> & dataA
, const std::vector<T> & dataB
, double (* function )(const T & a, const T & b)
)
- 将第三个参数的
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
)