如果这个问题看起来很蠢,我很抱歉。 但是我有下面的代码来编译。 我想知道是否有可能只传递函数的名称作为模板,然后在函数中填充它? 比如在这里我们有
template<typename T>
int getDiscount(T t,const std::vector<int> & discounts) {
return t(discounts);
}
是否可以像getDiscount.GetMaxDiscount.
那样只传入main
而不产生编译错误? 我在用C++11
#include <iostream>
#include <vector>
#include <algorithm>
class Discount {
public:
Discount() {}
int getMaxDiscount(const std::vector<int> & discounts) {
return *max_element(discounts.begin(),discounts.end());
}
int getMinDiscount(const std::vector<int> & discounts) {
return *max_element(discounts.begin(),discounts.end());
}
};
int getMinDiscount(const std::vector<int> & discounts){
Discount discount;
return discount.getMinDiscount(discounts);
}
int getMaxDiscount(const std::vector<int> & discounts){
Discount discount;
return discount.getMaxDiscount(discounts);
}
template<typename T>
int getDiscount(T t,const std::vector<int> & discounts) {
return t(discounts);
}
int main()
{
std::vector<int> discs = {1,2,3,4};
std::cout << getMaxDiscount(discs) << std::endl;
Discount discount;
std::cout << getDiscount(discount.getMaxDiscount) << std::endl;
return 0;
}
下面的代码将产生编译错误
int getDiscount(const std::vector<int> & discounts) {
return discount.getMaxDiscount(discounts);
}
int main()
{
std::vector<int> discs = {1,2,3,4};
std::cout << getMaxDiscount(discs) << std::endl;
Discount discount;
std::cout << getDiscount(std::mem_fn(&Discount::getMaxDiscount), discs) << std::endl;
return 0;
}
main.cpp:在函数“int getDiscount(const std::vector&;)”中:main.cpp:28:12:错误:“discount”未在此作用域中声明,返回discount.getmaxdiscount(discounts); main.cpp:在函数“int main()”中:main.cpp:37:41:错误:从类型为“std::_mem_fn&)>”std::cout<
您可以这样做:
std::cout << getDiscount(std::mem_fn(&Discount::getMaxDiscount), discount) << std::endl;
或者用lambda:
std::cout << getDiscount([](const Discount& discount){ return discount.getMaxDiscount()), discount) << std::endl;