我有一堂这样的课:
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;
};