質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

3回答

1501閲覧

C++で条件に応じた「ラムダ式」を返す関数が作れるのか

UMA821

総合スコア27

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

1クリップ

投稿2022/01/01 12:39

前提・実現したいこと

C++で動的に関数が作れるのか気になり,関数を返す関数を作成していました.
そこでラムダ式をそのまま返す関数が作成できるのか気になり,質問させていただきました.

こんなプログラムが書きたい

C++

1#include <iostream> 2 3auto f(int n) { 4 if (n&1) 5 return [](int b){return b;}; 6 else 7 return [](int a){return a*a;}; 8} 9 10int main() { 11 std::cout << f(8)(9) << std::endl; 12}

発生している問題・エラーメッセージ

prog.cc:7:9: error: 'auto' in return type deduced as '(lambda at prog.cc:7:16)' here but deduced as '(lambda at prog.cc:5:16)' in earlier return statement return [](int a){return a*a;}; ^ 1 error generated.

プログラムを実行
どちらもキャプチャなし引数戻り値の型は同じラムダ式だと思うのですが,別の型だと認識されているようです.

試したこと

関数ポインタを返すようにすると一応は動きました.しかし後々キャプチャをできるようにしたいのでこのやり方は好ましくないです.
色々調べていくとstd::functionを使う方法を見つけたのでこれで実装しました.この実装方法だとキャプチャも可能で優れものだとは思うのですが速度の差が大きいようです.生成した関数をかなりたくさんの回数実行しようとしているのでこれは困ります.
動的に関数が作れるのであればキャプチャ的機能を使える必要はありますがラムダ式にもこだわりません.何かいい方法はないのでしょうか.

補足情報(FW/ツールのバージョンなど)

Wandbox clang HEAD 13.0.0 20210721 (experimental)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

この実装方法だとキャプチャも可能で優れものだとは思うのですが速度の差が大きいようです.

処理系の最適化オプションを付け忘れているように見えます。-O2などを入れれば(それでも多少はstd::functionが遅いことになるようですが)、提示のような極端な差はないように見受けました。

投稿2022/01/01 13:28

saka1

総合スコア28

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

UMA821

2022/01/01 14:17

回答ありがとうございます。 ご指摘の通り最適化オプションは通常付けるものですね、忘れていました。 https://wandbox.org/permlink/R9Z7fiIydjtkqAeT 最適化オプションを追加して、更に正しい計測プログラムにするとほとんど速度に違いがないという結果になりました。ありがとうございます。
guest

0

色々調べていくとstd::functionを使う方法を見つけたのでこれで実装しました.この実装方法だとキャプチャも可能で優れものだとは思うのですが速度の差が大きいようです.生成した関数をかなりたくさんの回数実行しようとしているのでこれは困ります.

困るのは 「関数を返す関数が遅い」ですか?
それとも 「返ってきた関数が遅い」ですか?
さもなくば上記の両方ですか?

※ wandboxであなたのやったお試しは両者の和で比較しています。

投稿2022/01/01 13:52

episteme

総合スコア16612

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

UMA821

2022/01/01 14:20 編集

回答ありがとうございます。 私が求めているのは返ってきた関数の実行速度であり、質問にて提示したプログラムは私の意図と異なったものになっていました。 https://wandbox.org/permlink/R9Z7fiIydjtkqAeT 最適化オプションを追加して、更に正しい計測プログラムにするとほとんど速度に違いがないという結果になりました。ありがとうございます。
guest

0

ラムダ式はそれぞれが独自の型を持つので、記載の方法では型名が一致しません。
返り値の型をstd::function<int(int)>にすれば、自動的に変換されてエラーが出なくなります。

c++

1auto f(int n)->std::function<int(int)>;

投稿2022/01/01 13:24

Serbonis

総合スコア586

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Serbonis

2022/01/01 13:26

std::functionはすでに行われていましたね、よく読んでおらずすいません。
UMA821

2022/01/01 14:10

回答ありがとうございます。 私ももっと強調した書き方にすべきでした。紛らわしくてすみません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問