Итак, другой способ, если вы используете c ++ 11, это использовать функторы:
Вам нужно будет поместить это в начало вашего файла:
#include <functional>
Тип функтора объявлен в следующем формате:
std::function< return_type (param1_type, param2_type) >
Вы можете добавить переменную, содержащую функтор для суммы, например:
std::function<int(const std::vector<int>&)> sum;
Чтобы упростить задачу, давайтеукоротить тип параметра:
using Numbers = const std::vectorn<int>&;
Тогда вы можете заполнить функтор var любым из:
Лямбда:
sum = [](Numbers x) { return std::accumulate(x.cbegin(), x.cend(), 0); } // std::accumulate comes from #include <numeric>
Указатель функции:
int myFunc(Numbers nums) {
int result = 0;
for (int i : nums)
result += i;
return result;
}
sum = &myFunc;
Что-то, что создало 'bind':
struct Adder {
int startNumber = 6;
int doAdding(Numbers nums) {
int result = 0;
for (int i : nums)
result += i;
return result;
}
};
...
Adder myAdder{2}; // Make an adder that starts at two
sum = std::bind(&Adder::doAdding, myAdder);
Тогда, наконец, это можно использовать, это простое утверждение if:
if (sum)
return sum(x);
InТаким образом, функторы являются новым указателем на функцию, однако они более универсальны.На самом деле может быть встроенным, если компилятор достаточно уверен, но обычно совпадает с указателем на функцию.
В сочетании с std :: bind и lambda они значительно превосходят указатели на функции старого стиля C.
Но помните, что они работают в среде c ++ 11 и выше.(Не в C или C ++ 03).