コールバックを受け入れるテンプレート関数を使用してCスタイルの配列を設定します

zzxyz

したがって、アイテムごとにユーザー指定のコールバックを使用して配列を設定する関数を作成しているとしましょう。(私はそうではありませんが、最小限の例の目的で、私がそうであると仮定しましょう

これを行うために私が見つけることができる最もクリーンな方法は次のとおりです。

#include <functional>

template<typename T, typename Y>
void PopulateArray(std::function<int(Y*)> callback, T &pArray)
{
  for (int i = 0; i < sizeof(pArray); ++i)
    int x = callback(&pArray[i]);
}

int main()
{
  uint64_t myArray[5];
  uint64_t myUint = 42;
  PopulateArray( (std::function<int(uint64_t*)>) [=](auto x) {*x = myUint; return 0; },
    myArray);
}

上記のコードには2つの問題があります。

1)T配列型であるためには、パラメータを変更する方法がないようです。タイプの配列必要だとは言えません。つまり、両方が関連している場合でも、個別Tに宣言するY必要がありuint64_tます。)T1つのパラメーターをポインターとしてT、もう1つのパラメーターを配列として、単一のを宣言することをお勧めます。T

2)クライアントコード(メイン)は、ラムダをキャストするように強制されます。auto x明示的なタイプに変更しても問題は解決しないようです。

コードをより簡潔または読みやすくする可能性のある#1または#2の解決策はありますか?

コードはgcc、clang、およびVSでコンパイルする必要があります。私が考えることは、私たちの打ち鳴らすのビルドプロセスをアップグレードの問題だろうと私は、C ++ 14社のソリューションに興味があると思いますが、C ++ 11には、私が使用することができ、最新の標準です。myArrayをstd::array std::vectorなどに切り替えることを含むソリューションには興味がありません

ジャスティン

の要件を削除しますstd::function

// You could consider using an array type for the parameter:
// template <typename Callback, typename T, std::size_t N>
// void PopulateArray(Callback callback, T (&pArray)[N])
template<typename Callback, typename T>
void PopulateArray(Callback callback, T& pArray)
{
  // sizeof(pArray) as in the question is almost certainly not what you 
  // want. It returns the size *in bytes*, not the length of the array.
  // Thus, if you specified this to take an array reference,
  // `for (std::size_t i = 0; i < N; ++i)` would be correct.

  // However, as Barry mentioned in the comments, a range-based for loop
  // is the best solution.
  for (T& element : pArray)
    callback(&element);
}

int main()
{
  std::uint64_t myArray[5];
  PopulateArray([](auto x) {*x = 42; return 0; },
    myArray);
}

std::function高価なタイプです。仮想関数呼び出し(または非常に類似した手法)を使用し、メモリを割り当てる可能性があります。関数を保存していない場合、特に関数がすでにテンプレートである場合は、パラメーターとして任意のコールバックを使用してください。コールバックの型を本当に制約したい場合は、function_ref型(まだ標準化されていない)を使用するか、それcallback(your, args)が有効であることを確認してください

template<typename Callback, typename T>
auto PopulateArray(Callback callback, T& pArray)
    -> decltype(callback(*std::begin(pArray)), void())
{
  for (T& element : pArray)
    callback(&element);
}

また、この特定のケースでは、アルゴリズムを使用できます

int main()
{
  uint64_t myArray[5];
  uint64_t myUint = 42;
  // If it's all the same value:
  std::fill(std::begin(myArray), std::end(myArray), myUint);
  // To call a function to populate the array:
  std::generate(std::begin(myArray), std::end(myArray), [myUint] {
    return myUint;
  });
  // Or possibly:
  std::for_each(std::begin(myArray), std::end(myArray),
    [myUint](uint64_t& element) {
      element = myUint;
    });
}

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

静的コールバックパラメーターを使用してC関数を、プライベートメンバーをコールバックとして受け入れるC ++関数にラップする

分類Dev

配列とベクトルへの参照の両方を受け入れる関数テンプレートをどのように作成しますか?

分類Dev

C ++は関数をテンプレートとして受け入れ、関数の戻り値の型のベクトルを返します

分類Dev

TypeScriptを使用して、配列を受け入れるReactステートレス関数型コンポーネントを作成する

分類Dev

任意の数とタイプの引数を受け入れる関数をクラステンプレート引数として渡す

分類Dev

C ++メンバー関数を使用して、単純な静的関数ポインターを受け取るコールバックを処理する

分類Dev

JavaScriptJestテスト; コールバック関数を使用して配列内の要素を変更する

分類Dev

Cythonを使用してc ++テンプレートをラップし、任意のnumpy配列を受け入れます

分類Dev

c ++ 11関数コールバックを使用して複数のテンプレートパラメータを宣言する方法

分類Dev

Pointオブジェクトのリストを受け入れ、指定されたリストのXメンバーとYメンバーの最小値と最大値を決定するタプルを使用してメソッドを作成する

分類Dev

Julia:複数の配列タイプを受け入れるテンプレート関数

分類Dev

Pythonで特定の文字列のみを受け入れ、if / elseを使用してwhileループを中断するように変数を設定します

分類Dev

タプル内のインデックスによって決定されるint型をコンストラクターが受け取ったさまざまなドライブクラス要素を含むタプルを作成します

分類Dev

ループを使用してテーブルから複数のレコードを選択し、MSAccessのバインドされていないテキストボックスに入力します

分類Dev

3.1以降のTypeScriptは、コールバック関数の引数タイプを受け入れません

分類Dev

タプルを受け入れる関数のシンタックスシュガーはありますか?

分類Dev

別のクラスのunique_ptrを使用してコールバック関数を設定します

分類Dev

プレフィックスを使用して動的セッション変数(配列)を設定し、foreachを使用してループします

分類Dev

テンプレートを使用してCSSスタイルのプロパティを設定する

分類Dev

多くの種類の関数のパラメーターとして関数ポインターを受け入れる関数のテンプレート関数を作成します

分類Dev

コンポーネントのスタイルプロパティを入力して配列を受け入れるにはどうすればよいですか?

分類Dev

Visual Studio 2017を更新し、コンパイルエラーC7510が発生するようになりました:「コールバック」:依存テンプレート名の使用には「テンプレート」をプレフィックスとして付ける必要があります

分類Dev

行列列とベクトルの両方を受け入れる固有のテンプレート関数

分類Dev

malloc()関数を使用してグローバル配列サイズを設定し、ダンプコアを取得します

分類Dev

テンプレート関数を宣言して、任意のコンテナを受け入れますが、含まれているタイプは1つだけです

分類Dev

C ++でユニバーサル参照引数を使用してテンプレートクラスのコンストラクターを作成する方法

分類Dev

オプションのパラメーターを受け入れ、そのタイプに基づいて、フィルターをかけ、アイコンを返すことができる関数を作成しようとしています

分類Dev

パラメータを使用してDjangoのURLまたはHTMLテンプレートをレンダリングするAJAXコールバック関数を取得するにはどうすればよいですか?

分類Dev

インデックスを使用して複数の配列の値をテーブルに挿入する

Related 関連記事

  1. 1

    静的コールバックパラメーターを使用してC関数を、プライベートメンバーをコールバックとして受け入れるC ++関数にラップする

  2. 2

    配列とベクトルへの参照の両方を受け入れる関数テンプレートをどのように作成しますか?

  3. 3

    C ++は関数をテンプレートとして受け入れ、関数の戻り値の型のベクトルを返します

  4. 4

    TypeScriptを使用して、配列を受け入れるReactステートレス関数型コンポーネントを作成する

  5. 5

    任意の数とタイプの引数を受け入れる関数をクラステンプレート引数として渡す

  6. 6

    C ++メンバー関数を使用して、単純な静的関数ポインターを受け取るコールバックを処理する

  7. 7

    JavaScriptJestテスト; コールバック関数を使用して配列内の要素を変更する

  8. 8

    Cythonを使用してc ++テンプレートをラップし、任意のnumpy配列を受け入れます

  9. 9

    c ++ 11関数コールバックを使用して複数のテンプレートパラメータを宣言する方法

  10. 10

    Pointオブジェクトのリストを受け入れ、指定されたリストのXメンバーとYメンバーの最小値と最大値を決定するタプルを使用してメソッドを作成する

  11. 11

    Julia:複数の配列タイプを受け入れるテンプレート関数

  12. 12

    Pythonで特定の文字列のみを受け入れ、if / elseを使用してwhileループを中断するように変数を設定します

  13. 13

    タプル内のインデックスによって決定されるint型をコンストラクターが受け取ったさまざまなドライブクラス要素を含むタプルを作成します

  14. 14

    ループを使用してテーブルから複数のレコードを選択し、MSAccessのバインドされていないテキストボックスに入力します

  15. 15

    3.1以降のTypeScriptは、コールバック関数の引数タイプを受け入れません

  16. 16

    タプルを受け入れる関数のシンタックスシュガーはありますか?

  17. 17

    別のクラスのunique_ptrを使用してコールバック関数を設定します

  18. 18

    プレフィックスを使用して動的セッション変数(配列)を設定し、foreachを使用してループします

  19. 19

    テンプレートを使用してCSSスタイルのプロパティを設定する

  20. 20

    多くの種類の関数のパラメーターとして関数ポインターを受け入れる関数のテンプレート関数を作成します

  21. 21

    コンポーネントのスタイルプロパティを入力して配列を受け入れるにはどうすればよいですか?

  22. 22

    Visual Studio 2017を更新し、コンパイルエラーC7510が発生するようになりました:「コールバック」:依存テンプレート名の使用には「テンプレート」をプレフィックスとして付ける必要があります

  23. 23

    行列列とベクトルの両方を受け入れる固有のテンプレート関数

  24. 24

    malloc()関数を使用してグローバル配列サイズを設定し、ダンプコアを取得します

  25. 25

    テンプレート関数を宣言して、任意のコンテナを受け入れますが、含まれているタイプは1つだけです

  26. 26

    C ++でユニバーサル参照引数を使用してテンプレートクラスのコンストラクターを作成する方法

  27. 27

    オプションのパラメーターを受け入れ、そのタイプに基づいて、フィルターをかけ、アイコンを返すことができる関数を作成しようとしています

  28. 28

    パラメータを使用してDjangoのURLまたはHTMLテンプレートをレンダリングするAJAXコールバック関数を取得するにはどうすればよいですか?

  29. 29

    インデックスを使用して複数の配列の値をテーブルに挿入する

ホットタグ

アーカイブ