std::unique_ptr
Visual Studio 2013 RC と C++を使用して、 を使用してバインドされた関数にを渡そうとしていstd::bind
ます。しかし、これを試してみるとVSが気に入らないようで困っています。ここに私がコンパイルしようとしているものがあります:
#include <memory>
#include <iostream>
#include <functional>
void func(std::unique_ptr<int> arg)
{
std::cout << *arg << std::endl;
}
int main()
{
std::function<void (std::unique_ptr<int>)> bound =
std::bind(&func, std::placeholders::_1);
std::unique_ptr<int> ptr(new int(42));
bound(std::move(ptr));
return 0;
}
これは GCC 4.8.1 でコンパイルされますが、VS2013 RC ではコンパイルされません。私は常に VS の移動セマンティクスに問題を抱えていましたが、生のポインターstd::unique_ptr
の代わりに使用したいと思っています。std::shared_ptr
私が見つけた1つの回避策は、関数の署名を変更して を受け入れることstd::unique_ptr&
です.私は特に醜いことをします:func
std::unique_ptr
#include <memory>
#include <iostream>
#include <functional>
#include <future>
#include <string>
void func(std::unique_ptr<int>& arg)
{
std::cout << *arg << std::endl;
}
int main()
{
std::function<void (std::unique_ptr<int>&)> bound =
std::bind(&func, std::placeholders::_1);
std::unique_ptr<int> ptr(new int(42));
std::promise<void> prom;
std::async(
[&bound, &ptr, &prom]
{
std::unique_ptr<int> movedPtr = std::move(ptr);
prom.set_value();
bound(std::move(movedPtr));
});
prom.get_future().wait();
// Wait here
std::string dummy;
std::cin >> dummy;
}
func
の署名を変更せずにこれを回避する方法はありますか?
ありがとう!