В словах Knuth, "преждевременная оптимизация является корнем всего зла!" Маленькая отсрочка так или иначе не будет, скорее всего, иметь большую часть эффекта в конце; я выбрал бы более читаемый.
Хорошо, вот еще одна попытка:
class CallProxy
{
public:
static adderClass* m_instance;
static int adder(int y)
{
return (*m_instance)(y);
}
};
adderClass* CallProxy::m_instance = NULL;
int main() {
myAdder f = adderFunction;
adderClass ac(2);
std::cout << f(1) << std::endl;
std::cout << ac(2) << std::endl;
printer(f, 3);
CallProxy::m_instance = ∾
printer(CallProxy::adder, 4);
}
Проблема в том, что у вас есть принтер
скомпилирован как требующий получения указателя на функцию и ничего другого, поэтому вы должны отправить ему указатель на функцию. С указателем на функцию вам некому держать ваш экземпляр. Таким образом, это решение делает это с помощью статического члена данных.
Имейте в виду, что это делает этот код небезопасным для потоков. Два потока, которые выполняют main
одновременно, могут помещать две разные вещи в m_instance.
Хотя функция повышения ведет себя как обычный указатель на функцию, это другой тип. Таким образом, вы не можете просто назначить функцию повышения для указателя функции.
В своем коде вы можете просто заменить
typedef int (*myAdder)(int);
на
typedef boost::function1< int, int > myAdder;
, и все будет работать.
примерно так:
template<typename AdderT>
void printer(AdderT h, int y) {
std::cout << h(y) << std::endl;
}
Кроме того, вам не нужна boost :: function
. Вы можете просто набрать:
adderClass ac(2);
std::cout << f(1) << std::endl;
std::cout << ac(2) << std::endl;
printer(f, 3);
printer(ac, 4);