implementation of std::function : C++
Type Erasure
Type Erasure : C++
型消去を行い, 動的ディスパッチによって(関数 | メソッド | Lambda)を呼び出す
cf., https://youtu.be/xJSKk_q25oQ?si=ITXEpXdGWf5p7bI6
code:cpp
template<typename T>
class function;
template<typename R, typename ... Args>
class function<R(Args...)>
{
public:
template<typename F>
function(F func)
: callable{std::make_unique<callable_impl<F>>(std::move(func))}
{
}
R operator()(Args... args)
{
return callable->call(args...);
}
private:
struct callable_base
{
virtual R call(Args...) = 0;
virtual ~callable_base() = default;
};
template<typename T>
struct callable_impl : callable_base
{
callable_impl(T callable) : callable{std::move(callable)}
{
}
R call(Args... args)
{
return std::invoke(callable, args...);
}
T callable;
};
std::unique_ptr<callable_base> callable;
};
std::invoke : C++
関数呼び出しを委譲する
Static Template
#C++
#template