後で実行できるように、一般的に関数呼び出しを「ピクル」したいと思います。これらの関数の戻りタイプは常にvoid
(今のところ)になります。このようなもの:
template<typename F, typename... Args>
std::function<void()>
pickle(F function, Args&&... args) {
return std::bind(F, args...);
}
問題は、args
const参照が含まれている場合std::bind
、値をコピーコンストラクトしようとすることです。これは、型にコピーコンストラクターがない場合でも、常に望ましいとは限らず、有効でさえありません。std::ref
左辺値参照に使用し、左辺値参照に通常を使用する方法で引数を転送するにはどうすればよいstd::forward
ですか?
例
#include <functional>
class NonCopyable {
public:
NonCopyable() {}
NonCopyable(const NonCopyable&) = delete;
};
template<typename F, typename... Args>
std::function<void()>
pickle(F function, Args&&... args)
{
return std::bind(function, std::forward<Args>(args)...);
}
int main()
{
NonCopyable obj;
auto f = pickle(
[](const NonCopyable&) {},
obj
);
return 0;
}
上記のスニペットはコンパイルされず、削除されたコピーコンストラクターについて不平を言います。(誰かがそれを提案したので、私はここで前方に使用しましたが、それ以来彼らの答えを削除したようです)。