Шаблоны функторов C ++ - PullRequest
0 голосов
/ 19 мая 2011

Учитывая следующий класс, который просто отображает внутренний функтор f на функцию, которая будет запущена позже:

class A {
private:
   int (A::*f)(int);
   int foo(int x) { return x; }
   int bar(int x) { return x*2; }
public:
   explicit A(bool foo=true) { f = foo ? &A::foo : &A::bar; }
   int run(int x) { return (this->*f)(x); }
};

Теперь скажите, что у меня есть другой класс, B:

class B {
public:
   int foo(int) { return x*x; }
};

И функция foo:

int foo(int x) { return 0; }

Я знаю, что невозможно A назначить и запустить B::foo или foo, поскольку их прототипы различаются: int (A::*)(int) против int (B::*)(int) против int (*)(int).

То, что я спрашиваю, есть ли у них какой-либо способ шаблонизировать A::f так, чтобы он мог взять любого из них?

Ответы [ 2 ]

6 голосов
/ 19 мая 2011

Обычно вы используете std:: / boost:: / std::tr1 ::function<int(int)> для такого рода работы. Может принимать любой объект функции (включая указатель) с правильной подписью. Вы можете создавать объекты функций, которые вызывают функции-члены, используя bind, доступные в том же пакете.

2 голосов
/ 19 мая 2011

Я не совсем уверен, что вы пытаетесь достичь, но вы можете посмотреть на:

  • Boost.Function - может обернуть любой вид вызываемого
  • Boost.Bind - может использоваться для привязки функции-члена к экземпляру
...