Можно ли передать функцию шаблона в качестве аргумента без заполнения собственных аргументов? - PullRequest
0 голосов
/ 17 июня 2020

Простите, если вопрос выглядит глупо. Но у меня есть следующий код, который компилируется. Мне было интересно, можно ли передать в качестве шаблона только имя функции, а затем заполнить его функцией? Как, например, здесь у нас есть

template<typename T>
    int getDiscount(T t,const std::vector<int> & discounts) {
        return t(discounts);
    }

Можно ли просто передать main, например getDiscount(discount.getMaxDiscount), не получая ошибки компиляции? Я работаю над 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;
}

1 Ответ

3 голосов
/ 17 июня 2020

Вы можете сделать:

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

или с лямбда:

std::cout << getDiscount([](const Discount& discount){ return discount.getMaxDiscount()), discount) << std::endl;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...