簡體   English   中英

C ++:將不可移動的函子傳遞給std :: function

[英]C++: Passing a non moveable functor to a std::function

如何將不可移動的對象傳遞給std :: function? 一個簡單的替代方法是傳遞一個std::reference_wrapper ,這將導致功能生命周期的需求取決於對象。 下面的示例代碼可以更好地解釋該問題。


class Player {
  std::atomic_int runs {0};
  std::string name;

public:
  Player(std::string&& name) : name(std::move(name)) {}  //...
  void inc() { ++runs;}
};

class PlayerStats {
  std::array<std::unique_ptr<Player>,2> players;
public:
  PlayerStats() {
    for(int i = 0; i<2 ; i++)
      players[i] = std::unique_ptr<Player>(new Player{"player"+std::to_string(i)});
  }
  Player* const operator() (int index) const {
    return players[index].get();
  }
};

using player_total_f = std::function<Player* const(int index)>;

class GameStats {
  std::string game;
  std::string date;
  player_total_f f;

public:
  GameStats(std::string&& game, std::string&& date, player_total_f&& _f) :
    game(std::move(game)), date(std::move(date)), f(std::move(_f)) {}
};

int main(int argc, char *argv[])
{
  PlayerStats st;
  //GameStats("game1","10.11",std::ref(st)); //this seems like the only possibility, no way to make GameStats own the functor
  return 0;
}

鑒於該函數不可復制,我該如何在此處將PlayerStats設置為PlayerStats ,似乎唯一可能是std :: ref?

template<class F>
auto shared_function( F&& f ){
  auto spf=std::make_shared<std::decay_f<F>>(std::forward<F>(f));
  return [spf=std::move(spf)](auto&&...args)->decltype(auto){
    return (*pf)(decltype(args)(args)...);
  };
}

在共享的ptr中擁有它。 稍微更改語義,但對其進行修復。

或編寫自己的非復制std函數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM