Функция-член C ++, примененная к объекту - PullRequest
3 голосов
/ 01 февраля 2010

Я хочу вызвать функцию-член, передав ее в качестве параметра шаблона, без использования наддува возможно. Вот пример того, что я пытался сделать,

class object { void method(); }

{
object object_instance;
...
apply<object:: method>();
...

template<class F>
void apply() { F(object_instance); } // want to call object_instance.F()
}

это не работает, поэтому вопрос в том, как мне связать объектный метод с объектом. Спасибо

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

Ответы [ 4 ]

5 голосов
/ 01 февраля 2010

Что-то вроде:

struct foo
{
    void bar(void) {}
};

template <typename R, typename C>
R apply(C& pObject, R (C::*pFunc)())
{
    return (pObject.*pFunc)();
}

int main(void)
{
    foo f;
    apply(f, &foo::bar);
}

вот так.

1 голос
/ 01 февраля 2010

Это похоже на ваш код и позволит передавать функцию-член в качестве параметра шаблона:

class object { public: void method() {} };
object object_instance;

template<void (object::*F)()>
void apply() {
    (object_instance.*F)();
}

int main() {
    apply<&object::method>();
    return 0;
}
0 голосов
/ 01 февраля 2010

Этот пример предназначен для ссылок на значения в языке C ++. Работает не на всех компиляторах.

class Sample
{
public:
    void fun() { cout << "Sample::fun\n"; }
};

template<typename Function>
void FunCall( Function&& f)
{
    f();
}

void RvaluesDemo()
{
    FunCall([&]
    {
        Sample().fun();
    });
}
0 голосов
/ 01 февраля 2010

Поскольку функция-член не является типом или целочисленным значением, вы не можете передать ее в качестве параметра шаблона. Вы могли бы сделать то, что вам, кажется, нужно, создав структуру, которая вызывает функцию-член, хотя наличие объекта object_instance в шаблоне довольно вонючее.

Что вы на самом деле пытаетесь сделать?

...