我决定实现C++11类function。我正在检查我做的每件事都是正确的,没有遗漏任何东西:
template < typename > class function;
template < typename _Ret, typename... _Args > class function<_Ret(_Args...)>
{
public:
typedef _Ret result_type;
typedef function<result_type(_Args...)> _Myt;
typedef result_type(*pointer)(_Args...);
function()
: _f_ptr(nullptr)
{
}
template < typename _Fn_Ty > function(_Fn_Ty &&_Fn)
: _f_ptr(reinterpret_cast<pointer>(_Fn))
{
}
function(pointer &&_Fn)
: _f_ptr(_Fn)
{
}
function(const _Myt &_Rhs)
: _f_ptr(_Rhs.f_ptr)
{
}
function(_Myt &&_Rhs)
: _f_ptr(_Rhs.f_ptr)
{
}
~function()
{
}
_Myt &assign(pointer &&_Fn)
{
_f_ptr = _Fn;
return *this;
}
_Myt &operator=(pointer &&_Fn)
{
return assign(_Fn);
}
template < typename _Fn_Ty > _Myt &assign(_Fn_Ty &&_Fn)
{
_f_ptr = reinterpret_cast<pointer>(_Fn);
return *this;
}
template < typename _Fn_Ty > _Myt &operator=(_Fn_Ty &&_Fn)
{
return assign<_Fn_Ty>(_Fn);
}
result_type operator()(_Args... _Arguments)
{
if (_f_ptr == nullptr)
{
throw std::exception("nullptr found instead of function");
}
return _f_ptr(_Arguments...);
}
pointer &ptr() const
{
return _f_ptr;
}
operator pointer &() const
{
return _f_ptr;
}
private:
pointer _f_ptr;
};发布于 2015-03-03 07:31:50
您的代码不可能工作,因为function<void(void)>的唯一非静态数据成员是void (*)(void)类型的单个指针。没有地方存放任何其他类型的函子。
换句话说,您已经实现了“包装在结构中的函数指针”的概念,但是您还没有实现类似于std::function的任何东西。
https://codereview.stackexchange.com/questions/43423
复制相似问题