私はこのようなクラスを持っています:
template <typename T>
struct operation {
typedef T result_type;
typedef ::std::shared_ptr<operation<T> > ptr_t;
};
::std::function
このタイプに一致するファンクターがあります。
::std::function<int(double, ::std::string)>
次のような署名を持つファンクターを作成したいと思います。
operation<int>::ptr_t a_func(operation<double>::ptr_t, operation< ::std::string>::ptr_t);
これを自動化された方法で実行して、特定::std::function
のタイプに対して同様のファンクターを作成できるようにします。
最後に、このしわを入れたいと思います。これ:
::std::function<int(operation<double>::ptr_t, ::std::string)>
結果は次のようになります。
operation<int>::ptr_t a_func(operation<double>::ptr_t, operation< ::std::string>::ptr_t);
ファンクターがすでにそれを受け入れている場合、operation<T>::ptr_t
それは彼らが何であるかを理解し、それらの非同期性自体を処理する用意があることを意味するからです。
どうすればいいですか?私はここで素朴で部分的に機能する試みをしています:
template <typename argtype>
struct transform_type {
typedef typename operation<argtype>::ptr_t type;
};
template <typename ResultType, typename... ArgTypes>
::std::function<typename transform_type<ResultType>::type(typename transform_type<ArgTypes...>::type)>
make_function(::std::function<ResultType(ArgTypes...)>)
{
return nullptr;
}
ただし、すでに型になっている引数は検出されませんstd::shared_ptr<operation<T> >
。そして、このtransform_typeの特殊化は、コンパイルに失敗します。
template <typename argtype>
struct transform_type<typename operation<argtype>::ptr_t>
{
typedef typename stub_op<argtype>::ptr_t type;
};