Вы не можете легко решить это.boost::function<>
и std::function<>
поддерживают не только функторы, вызываемые f()
, но и указатели на члены, вызываемые (secondArg.*firstArg)()
и члены данных, поэтому их конструкторы в основном отбрасывают все, а затем решают, что делать с типом,
Совсем нетривиально написать такой класс тестирования SFINAE, который защищает от неявных преобразований (и я даже не уверен, будет ли это вообще возможно, поскольку стандартная библиотека этого не делает.должна быть какая-то причина).Помните, что тип может вызываться из-за множества различных свойств - у него может быть функция преобразования в тип указателя функции и т. Д. Написание класса SFINAE, который может сделать эту работу, означает отклонение неявного преобразования в некоторых случаях и принятие неявного преобразования вдругие случаи основаны на действительно не очевидных свойствах вообще.
Если вы хотите избежать этой неоднозначности, я бы попробовал просто выбрать другое имя функции или, если это проблема с одним выстрелом, выполнить приведение на стороне вызывающего.