Хранение не подлежащего копированию, но перемещаемого объекта в std:: function

Предположим, что у меня есть функтор s, который является не подлежащим копированию, но движимым, как его сохранить в std:: function? например, как скомпилировать следующий код? (с использованием gcc 4.6)

#include <functional>
#include <iostream>

struct S
{
  S() = default;
  S(S const&) = delete;
  S& operator=(S const&) = delete;
  S(S&&) { }
  void operator()() { }
};

std::function<void()> func;

void make_func()
{
  S s;
  func = std::bind(std::move(s));  // This won't compile
}

int main()
{
  make_func();
}

Ответ 1

Насколько я понимаю стандарт, std::function предполагается скопировать. Поэтому вы не можете напрямую достичь того, чего хотите.

Вы можете уйти с какой-то пользовательской оболочкой, я бы предположил. Это будет выглядеть примерно так:

  • сделайте вашу обертку содержащей std::shared_ptr фактическим функтором;
  • когда оболочка построена из функтора rvalue, переместите функтор в динамически выделенную память;
  • Конструктор копирования для оболочки и деструктора просто обрабатывается shared_ptr copy-ctor/destructor;
  • operator() для обертки разыгрывает интеллектуальный указатель на реальный функтор и передает на него operator().