Итак, у меня есть функция, где, используя C ++ 17, я могу применить любой метод из любого объекта:
#include <functional>
template <typename Object, typename Method, typename ... Args>
void ApplyMethod (Object && object, Method && method, Args && ... args)
{
std::invoke(method, object, args...);
}
Что я спрашиваю: есть ли способ улучшить это, требуя меньше работы для вызывающей функции при перегруженном методе.
Пример использования с перегруженными методами:
#include <iostream>
class Foo
{
int bottles;
public:
void Edit ()
{
bottles = 666;
}
void Edit (int number)
{
bottles = number;
}
void Talk () const
{
std::cout << bottles << " bottles of beer of the wall" << std::endl;
}
};
class Bar
{
Foo foo;
void TrickEdit (int number)
{
// Because Foo::Edit is overloaded, we need to do some work:
using Method = void (Foo::*)(int);
Method ptr = &Foo::Edit;
ApplyMethod(foo, ptr, number);
}
void TrickTalk () const
{
// it's a lot neater when the method isn't overloaded:
ApplyMethod(foo, &Foo::Talk);
}
public:
void Trick ()
{
TrickEdit(900);
TrickTalk();
}
};
int main ()
{
Bar().Trick();
return 0;
}
Вместо этого я пытаюсь выполнить работу над функцией. Кажется, проблема l ie в том, что &Foo::Edit
имеет два разных местоположения, в зависимости от того, на что мы ссылаемся Edit
.
В C ++ FAQ - Указатели на функции-члены Страуструп и другие авторитетные авторы читают:
Вопрос: мне нужно что-то вроде указателей на функции, но с большей гибкостью и / или поточной безопасностью; Есть ли другой способ?
Ответ: Используйте функционоид.
Вопрос: Какого черта это функционоид, и зачем мне его использовать?
Ответ: Функциональные вещества являются функциями стероидов. Функциональные тела строго более мощные, чем функции, и эта дополнительная мощность решает некоторые (не все) проблемы, с которыми обычно сталкиваются при использовании указателей на функции. [...] Функциональные средства не решают всех проблем, возникающих при создании гибкого программного обеспечения, но они строго более мощные, чем указатели функций, и их стоит хотя бы оценить. Фактически вы можете легко доказать, что функционоиды не теряют никакой власти над указателями на функции, поскольку вы можете представить, что старомодный подход указателей на функции эквивалентен глобальному (!) Объекту-функции. Поскольку вы всегда можете создать глобальный функциональный объект, вы не потеряли ни одного основания. QED.
Учитывая, что «мощь» программирования в основном заключается в сокращении дублирования работы, и что с помощью обычной функции мы бы избежали дополнительной работы на сайте вызовов, которую я описал в моем проблема, ответ на часто задаваемые вопросы подразумевает, что должно быть решение этой проблемы с помощью функционоидов. Однако я не могу понять, как функционоиды в этом случае могут помочь.