-
Notifications
You must be signed in to change notification settings - Fork 30
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
std::functionのメリット/デメリットとは #53
Comments
最適化の話はご指摘の通りだとして
|
動的に型をディスパッチできることがメリットであり、そのために実行時コストが生じることがデメリットでしょう。 配列の要素、コールバック、データメンバのいずれにしてもコンパイル時に型が確定するなら |
コンパイル時に確定させられるなら、templateを使えばいいだけの話ですから、その場合 #include <type_traits>
template<typename Func>
class Foo {
Func f;
public:
template<typename F, std::enable_if_t<std::is_invocable_r_v<int, Func, int>, std::nullptr_t> = nullptr>
Foo(F&& f) : f(std::forward<F>(f))
{}
};
template<typename F, std::nullptr_t = nullptr>
Foo(F&&) -> Foo<std::remove_cv_t<std::remove_reference_t<F>>>; |
SaitoAtsushi さんコメントに関連した追加情報です。
C++標準では
より噛み砕いた表現に言い換えるならば、下記のようになるでしょうか:
rinatz さんが挙げたメリットは「2: 第一級オブジェクトとして扱える」ことの恩恵と言えます。 一方のデメリットはC++標準には言及ありませんが、挙げるととしたら下記が考えられます:
|
https://rinatz.github.io/cpp-book/ch02-09-function-objects/
という説明では、「じゃあ全部std::functionを使えばいいのか!」というミスリードをしかねないという印象を受けます。最適化を阻害するというデメリットを語らないのはフェアではないように感じます。
また、std::functionのメリットが簡潔に書けるだけというのも違う気がします。それだけならusing aliasで型定義すれば済むはず。そうではなくて、型消去によって関数オブジェクトを配列に格納できるということが利点であるはずです。lambda式を含む関数オブジェクトは、引数と戻り値の型が一致していても別の型をもつため、配列に格納できないところを、型消去してくれるstd::functionによって達成できるわけですよね。
The text was updated successfully, but these errors were encountered: