メンバー関数のスロットを他のオブジェクトに再バインドする必要があるため(つまり、メンバー関数ポインタと問題のクラスへのポインタを格納する方法が必要でした)、自分自身の「スロット」という別名を呼び出しました。私のスロットクラスは、std :: functionには何が欠けていますか?
私のシステム(64ビットLinux)でstd::function
が2回(GCC/libstdC++)から3回(Clang/libC++)の類似クラスを実装していることを発見しました。サイズは16バイトです。
target
のようなものを理解し
template<typename... ArgTypes>
class slot
{
public:
virtual ~slot() = default;
virtual void operator()(const void* object, ArgTypes...) const = 0;
protected:
slot() = default;
};
template<typename Callable, typename... ArgTypes>
class callable_slot : public slot<ArgTypes...>
{
public:
callable_slot(Callable function_pointer_or_lambda) : callable(function_pointer_or_lambda) {}
virtual void operator()(const void*, ArgTypes... args) const override { callable(args...); }
private:
Callable callable;
};
template<typename Callable>
class callable_slot<Callable> : public slot<>
{
public:
callable_slot(Callable function_pointer_or_lambda) : callable(function_pointer_or_lambda) {}
virtual void operator()(const void*) const override { callable(); }
private:
Callable callable;
};
template<typename Callable, typename... ArgTypes>
using function_slot = callable_slot<Callable, ArgTypes...>;
が、私ドン:非メンバ関数とラムダのための実装はこのように書きます(const void*
最初の引数はありませんここに示されているメンバ関数のスロットを持つ均一性のためです)欠けている機能のどれかがオブジェクトのサイズを増やすとは思わない。
私が求めているのは、std::function
が私の安価な実装よりもサイズが大きいのはなぜですか?
'のstd :: function'がmake_slotヘルパー機能によって、小さなオブジェクトの最適化 – Brian