入門
これは、コードに遭遇小さな問題であり、返答がないあなたは同じ問題に友人を助けるために解決した後、それを共有した後、オンラインで見つけます
私たちの問題の導入にコードのシンプルな作品で、対象者の見た目にストレート
template<typename Type>
struct wrapper_type{
Type fun;
...
};
?これは今需要がある場合は、シンプルな汎用オブジェクトを宣言することですまず第一に私たちは、あなたは多分あなたが意味する、良い十分ではありませんいつものように、言うかもしれないそれの一般的なオブジェクトへのスマートポインタが必要だということです。
template<typename Type>
struct wrapper_type{
Type fun;
...
};
std::unique_ptr<wrapper_type<Type>> ptr_to_wrapper;
残念ながら間違ってばかげている、クラス宣言の種類以上のこのタイプは、はるかに悪いです、とさえスコープが同じではありません、我々はそれを行うことができますどのように、解決策を継承することです:
struct base_type{
...
};
std::unique_ptr<base_type> ptr;
template<typename T>
struct wrapper_type : base_type{
T fun;
...
};
だから我々並行プログラミングする場合、通常の状況下で、我々はインターフェイスとして呼び出し可能オブジェクトを持っている可能性があるときに我々が正常にポイントすることができ、あなたは、何を使用することは比較的簡単たとえば、あると言うかもしれませんstd ::関数を実行するには十分、しかし、我々はノートを持っている私たちを意味可動缶コピーされていないのstd ::機能は、我々は一般的にはstd :: packaged_taskで使用される複製可動し、並行プログラミングであるという事実は、その私たちは、インタフェースのstd ::機能を使用できない場合はstd :: packaged_taskを渡すために、我々はラッパークラスを記述する必要がこの時間は、より多くのスキルが便利になりました
class function_wrapper{
struct base_type{
virtual void call() = 0;
virtual ~base_type() {}
};
std::unique_ptr<base_type> ptr;
template<typename T>
struct wrapper_type : base_type{
T fun;
wrapper_type(T&& f) : fun(std::move(f)){}
void call() override {fun();}
};
public:
template<typename T>
function_wrapper(T&& f) :
ptr(new wrapper_type<T>(std::move(f))){}
function_wrapper() = default;
function_wrapper(function_wrapper&& f) : ptr(std::move(f.ptr)){}
void operator()() {ptr->call();}
function_wrapper& operator=(function_wrapper&& f){
ptr = std::move(f.ptr);
return *this;
}
function_wrapper(const function_wrapper&) = delete;
function_wrapper(function_wrapper&) = delete;
function_wrapper& operator=(const function_wrapper&) = delete;
};
参考:
アクションでのC ++同時実行