я хочу принимать аргумент только лямбда функции (исключить функторы и указатели на функцию). Сейчас вот так
template <typename C>
void callOnce(C&& c)
{
static_assert(std::is_class_v<C>, "must be a lambda type");
static_assert(std::is_invocable_v<C>, "must be a lambda type");
[[maybe_unused]] static bool is_called = (c(), true);
}
лямбда же и есть функтор, как их можно исключить?
Но лямбда это и есть функтор же
хмм, ну т.е. класс с перегруженным оператором () тоже самое что и лямбда? только синтаксически разница?
лямбда превращается в класс c оператором ()
ок, тогда разрешить функтор (лямбду) и запретить указатель на функцию и наверное std::function - не уверен в этом
Какую задачу ты решаешь?
разница еще в том, что тип заранее неизвестнен и для лямбды он уникален
Функтор может хранить состояние
Типа, задача "позвать функцию один раз" уже решается std::call_once
я знаю но мне не нравится что там объет должен быть
и лямбда тоже может иметь и захват и mutable на нём
Указатели можно отсеить через is_pointer. Еще можно застраховаться от ссылки на функцию через is_function<remove_reference>.
https://gcc.godbolt.org/z/79zzGsYMM такой сойдет?
а лямбда с захватом по значению?
Обсуждают сегодня