提问者:小点点

是否可以将模板函数作为参数传递而不填充它自己的参数?


如果这个问题看起来很蠢,我很抱歉。 但是我有下面的代码来编译。 我想知道是否有可能只传递函数的名称作为模板,然后在函数中填充它? 比如在这里我们有

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<


共1个答案

匿名用户

您可以这样做:

std::cout << getDiscount(std::mem_fn(&Discount::getMaxDiscount), discount) << std::endl;

或者用lambda:

std::cout << getDiscount([](const Discount& discount){ return discount.getMaxDiscount()), discount) << std::endl;