auto lam = [](int a, int b, int c) { return a < b && b < c; };
struct functor {
int a;
int b;
bool operator()(int n) const { return a < n && n < b; }
};
В первой версии мы
std::vector<std::function<bool (int)>> lamvals;
// get parameters and for each
lamvals.emplace_back(std::bind(lam, a, std::placeholders::_1, b));
Альтернативой является
std::vector<functor> lamvals;
// get parameters and for each
lamvals.emplace_back(functor{a, b});
В обоих случаях мы имеем простую итерацию
return std::any_of(lamvals.cbegin(), lamvals.cend(),
[n](const decltype(lamvals)::value_type & t){return t(n);});
Я вижу разницу в скорости 3: 1, когда связанная лямбда медленнее. Функтор работает почти так же быстро, как хранение целых пар и жесткое кодирование тестов. Очевидно, что hardcoding не так полезен для производственного кода, потому что в игре будет несколько функций, а не только между ними. Тем не менее, я могу пойти либо с множеством функторов, либо со многими лямбдами. У последнего меньше строк кода и выглядит более чистым, но я не думаю, что могу позволить себе эту разницу в скорости; этот код находится в критическом цикле.
Я ищу предложения ускорения.