C++ - C++20 ビューを関数に渡す方法

okwaves2024-01-25  12

ジェネレータをパラメータとして受け取る関数を作成したいと考えています。

次の点を考慮してください。


void function_which_takes_generator(type_i_dont_know view);

struct Pair {
  int a, b;
}

int main() {
  std::vector<Pair> pairs = //init to something
  function_which_takes_generator(pairs | transform([]{auto pair} {
    pair.x
  }));
}

type_i_dont_know 型は何になりますか?このパターンを実装するより良い方法はありますか? co ルーチンを使用するにはどうすればよいでしょうか?

tutorialspoint.com/…

– 

user12275552

2020 年 9 月 3 日 16:22

私'具体的にビューのタイプを取得する方法を尋ねています

– エドワード

2020 年 9 月 3 日 16:29

void function_that_takes_generator(std::ranges::view auto view) は、ビューのみを受け入れるように関数を制約します。

– メタルフォックス

2020 年 9 月 4 日 10:41



------------------------

関数ではなく関数テンプレートを作成します

template <typename View>
void function_which_takes_generator(View view)
{
    // ...
}

呼び出しサイトで表示される、単なる宣言ではなく定義が必要であることに注意してください。

5

1

テンプレートを使用せずにこれを行う方法はありますか?

– エドワード

2020 年 9 月 3 日 16:29

この関数を複数回呼び出すつもりですか?式transform([]{auto pain} { /* anything here */ }) は一意の型です(たとえ「anything here」を繰り返したとしても)引用;)

– カレス

2020 年 9 月 3 日 16:30

はい - 実際の使用例は、さまざまな glm::vec3 型を処理し、それらに関する情報を集約できる基本クラスを作成することです。

– エドワード

2020 年 9 月 3 日 16:32

いいえ、テンプレートである必要があります。共通のスーパータイプはありません。

– カレス

2020 年 9 月 3 日 16:35

2

C++20 では、次のようなテンプレートを作成できます void function_that_takes_generator(auto view) {}

– シジエン

2020 年 9 月 3 日 16:41

総合生活情報サイト - OKWAVES
総合生活情報サイト - OKWAVES
生活総合情報サイトokwaves(オールアバウト)。その道のプロ(専門家)が、日常生活をより豊かに快適にするノウハウから業界の最新動向、読み物コラムまで、多彩なコンテンツを発信。