Этот код работает до тех пор, пока операторов 1, как только их 2+ - выдает false
Как проверить. что класс функтор и как получить возвращаемый тип operator()?
Wataru, мне нужно проверить, что я могу в шаблоне вызвать pointer->operator()(someargs...) и при этом отличать от указателя на функцию, который вызывается через pointer(someargs...)
Wataru, у меня структура берет Т, мне Args нужно чисто для возвращаемого типа (известны только в шаблонном методе, шаблонной структуры), так что ответ с invoke_result_t подходит, для возвращаемого значения, но не подходит, чтобы различать функцию и объект
Павел Соколов, pointer->operator()(someargs...) или pointer(someargs...)
так может вам надо код поправить, чтобы и то и то вызывать как pointer(someargs...)? Смысл делать функтор, если его использование отличается от функции?
На 100% не уверен, но, кажется, для указателя на фукнцию можно писать pointer(someargs...), а можно *pointer(someargs...) и разницы не будет. То есть и для указателя на функтор и для указателя на фукнцию можно написать один вариант: *pointer(someargs...) и не важно, функтор это или функция.
maaGames, это интересное замечание, однако контекст - умный указатель, _instance это pointer, если это void() рапример, то это void(*)(), что вызывается как _instance(args...), если класс, то придется делать _instance->operator()(args...)
Павел Соколов, почему в обоих случаях (то есть один раз) не написать *_instance(args...) ? Какая разница, указатель или умный указатель или указатель на фукнцию? Так же очевидно, что у вас не может быть "умного указателя на фукнцию" в смысле smart_ptr.
> Смысл делать функтор, если его использование отличается от функции?
тут я имел в виду, что функтор делают как раз чтобы идентично запускать хоть функцию, хоть объект. А если вы отдельно явно вызываете функцию, то вместо корявого синтаксиса "x->operator()(args...)" можно вызываь номральную функцию, вместо оператора, чтобы синтаксис был приятнее "x->Function(args...)".
Я к тому, что если вызов функции и функтора делается по разному, то это ошибка в проектировании где-то. Это как в полиморфном объекте вызывать dynamic_cast и вызывать из него функцию, которую можно было выывать через базовый интерфейс.
maaGames, смысл есть в том, что это разные способы вызова
У меня через require сделан функтор для weak_ref
Получается у меня 2 функтора с require, один для указателя на функцию и для оператора
Это значит эти 2 функтора weak_ref надо разделить, иначе при генерации кода будут - неоднозначность вызова и ошибка в вызове operator(), если это функция или _instance() для указателя класса