Указатели функции к функциям членства в C++

В словах Knuth, "преждевременная оптимизация является корнем всего зла!" Маленькая отсрочка так или иначе не будет, скорее всего, иметь большую часть эффекта в конце; я выбрал бы более читаемый.

6
задан JamieC 11 December 2009 в 14:29
поделиться

3 ответа

Хорошо, вот еще одна попытка:

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 = &ac;
    printer(CallProxy::adder, 4); 
}

Проблема в том, что у вас есть принтер скомпилирован как требующий получения указателя на функцию и ничего другого, поэтому вы должны отправить ему указатель на функцию. С указателем на функцию вам некому держать ваш экземпляр. Таким образом, это решение делает это с помощью статического члена данных.

Имейте в виду, что это делает этот код небезопасным для потоков. Два потока, которые выполняют main одновременно, могут помещать две разные вещи в m_instance.

2
ответ дан 17 December 2019 в 20:32
поделиться

Хотя функция повышения ведет себя как обычный указатель на функцию, это другой тип. Таким образом, вы не можете просто назначить функцию повышения для указателя функции.

В своем коде вы можете просто заменить

typedef int (*myAdder)(int);

на

typedef boost::function1< int, int > myAdder;

, и все будет работать.

0
ответ дан 17 December 2019 в 20:32
поделиться

примерно так:

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);
0
ответ дан 17 December 2019 в 20:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: