насколько я понимаю, функция-член отличается от нормальной функции, потому что есть дополнительный параметр указателя this.
Итак, моя идея состоит в том, чтобы сделать следующую функцию шаблона члена для одного из моих классов:
template <class T>
void ApplyFunction(function<void(vector<int>&, T)> fun, T val);
а затем я буду использовать его внутри одного из моих классов, например:
Thing.ApplyFunction(myMethod, this);
а Thing будет использовать myMethod из моего текущего экземпляра класса.
По большей части этот код является предположением, поэтому я хотел бы пояснить, сработает ли это. Также не уверен, в каком направлении это:
void ApplyFunction(function<void(vector<int>&, T)> fun, T val);
или же
void ApplyFunction(T val, function<void(vector<int>&, T)> fun);
Пример кода, описывающий, почему мне может понадобиться что-то вроде этого:
void ClassA::callbackMethod(vector<int> &array)
{
//I can edit the array here
}
void ClassA::someMethod(void)
{
ClassB B;
B.ApplyFunction(callbackMethod, this);
//now whenever B wants to edit the array, it can by using callbackMethod
B.ComplicatedStuff(); // B uses the callbackMethod multiple times here
}
класс, к которому принадлежит Thing, будет использовать функцию-член какого-либо другого класса в качестве аргумента указателя функции.
std :: function - это шаблон класса, концептуально не имеющий ничего общего с указателем на член.
Какая польза от вызова B.ApplyFunction перед вызовом B.ComplicatedStuff? Почему бы не передать функцию напрямую в B.ComplicatedStuff?
возможно, есть B.ComplicatedStuff и B.ComplicatederStuff, но все равно это сводится к одному и тому же вопросу
Вы ищете std::invoke
@PasserBy не могли бы вы подробнее рассказать, как я бы использовал его для достижения аналогичных результатов
@PasserBy это C++ 17
@TheoWalton std::invoke(classmemberponter, classinstance, arguments... ) передаст указатель на classinstance как this на memberpointer. Но я думаю, что хранение лямбда может быть более прозрачным ... у обоих есть проблема с жизнью объекта
Что делает ApplyFunction?
@Yakk Я хочу, чтобы он вызывал функцию один раз, а затем сохранял ее, чтобы ее можно было вызывать в другой раз
@theo как вы собираетесь хранить T? Вам нужна буква T, кроме как для вызова функции?





Мне кажется, что вы просто планируете вызвать метод, и вам не нужно хранить вызываемый объект. В этом случае вам не следует использовать std::function, а просто взять вызываемый объект в качестве параметра шаблона.
template <class T>
void ApplyFunction(T&& func) {
func(/*pass in your vector here*/);
}
После этого вы можете вызвать его из A, передав лямбду.
void ClassA::someMethod(void)
{
ClassB B;
B.ApplyFunction([&](std::vector<int>& vec){
// do stuff with vec here
// or call a member function
callbackMethod(vec);
vec.push_back(2);
});
}
Это будет быстрее, поскольку передача такого параметра шаблона почти не требует дополнительных затрат при обычном вызове функции. Если функция является встроенной, это может быть так же дешево, как простой вызов функции-члена.
std::function - это оболочка со стиранием типов для любого вызываемого объекта и сопряженная с накладными расходами, используйте ее только в том случае, если вам нужно сохранить вызываемый объект для дальнейшего использования.
Редактировать
Если вы хотите сохранить функцию, вам не нужен шаблон, вы можете просто взять std::function в качестве параметра в ApplyFunction.
void ApplyFunction(std::function<void(std::vector<int>&)> func) {
//Store it, call it now or call it later.
m_func = func;
m_func(/*pass in your vector here*/);
}
Назовите это так же, с лямбдой.
Использование такой лямбды является предпочтительным методом при привязке функции-члена к экземпляру. Вместо того, чтобы передавать this отдельно, лучше обернуть его лямбдой и получить так сказать бесплатно.
проголосовали за, но, к сожалению, я хотел бы сохранить функцию внутри класса B - так что не выдержите принятия. Спасибо хоть
@TheoWalton, я вижу, добавил обновление, чтобы показать, как вы это сделаете.
Что именно вы пытаетесь решить?
this->myMethod(args)должен работать нормально (вероятно,myMethod(args)тоже).