Я хотел бы использовать лямбда-функции для асинхронного вызова метода для объекта с подсчетом ссылок:
void RunAsync(const std::function<void()>& f) { /* ... */ }
SmartPtr<T> objPtr = ...
RunAsync([objPtr] { objPtr->Method(); });
Создание лямбда-выражения, очевидно, создает копию, но у меня теперь есть проблема с преобразованием лямбда-выражениядля объекта std::function
также создается несколько копий моего умного указателя, и каждая копия увеличивает количество ссылок.
Следующий код должен демонстрировать это поведение:
#include <functional>
struct C {
C() {}
C(const C& c) { ++s_copies; }
void CallMe() const {}
static int s_copies;
};
int C::s_copies = 0;
void Apply(const std::function<void()>& fct) { fct(); }
int main() {
C c;
std::function<void()> f0 = [c] { c.CallMe(); };
Apply(f0);
// s_copies = 4
}
Хотя после этого количество ссылок становится нормальным, я бы хотел предотвратить слишком большое количество операций ссылок по соображениям производительности.Я не уверен, откуда все эти операции копирования.
Есть ли способ добиться этого с меньшим количеством копий моего объекта интеллектуального указателя?
Обновление: Компилятор Visual Studio 2010.