1

例えば、

Class myMath (){ int doMath(int x, int y)}

main()
  {
     myMath math[5];

     math[0].doMath(10,20);     //this will add x and y
     math[1].doMath(3,1);       //this will subtract x and y
     etc...
  }

これはどのように行うことができますか?私は c++ の初心者なので、詳しく説明してください :P ありがとうございます。

4

1 に答える 1

1

(この回答は、C++ の C++11 標準を想定しています。)

コメントに示されているように、配列に格納されているすべての操作は、2 つの整数引数を取り、整数を返すと想定できます。したがって、これらをこのデータ型のファンクターとして表すことができます。

std::function<int(int,int)>

そのデータ型の固定サイズの 5 要素配列は、次のように実装するのが最適です。

std::array<std::function<int(int,int)>,5>

以下は、これらのデータ型を利用する完全な例です。標準ライブラリ ( など) によって提供される関数オブジェクトを使用して、加算減算乗算、および除算の 4 つの基本演算を実装します。5 番目の算術演算もありますが、これには整数に対するべき乗のアドホックな実装を使用します。これは、ラムダ関数 (C++11 によって提供される無名関数の新しい型) として実装されます。配列に変換して格納することもできます。std::plus<int>std::minus<int>std::function<int(int,int)>

#include <iostream>
#include <functional>
#include <array>

int main()
{
  /* Customized arithmetic operation. Calculates the arg2-th
     power of arg-1. */
  auto power = [](int arg1, int arg2) {
    int result = 1;
    for (int i = 0 ; i < arg2 ; ++i)
      result *= arg1;
    return result;
  };

  /* Fixed-size array of length 4. Each entry represents one
     arithmetic operation. */
  std::array<std::function<int(int,int)>,5> ops {{
      std::plus<int>(),
      std::minus<int>(),
      std::multiplies<int>(),
      std::divides<int>(),
      power
  }};

  /* 10 + 20: */
  std::cout << ops[0](10,20) << std::endl;
  /* 3 - 1: */
  std::cout << ops[1](3,1) << std::endl;
  /* 3rd power of 9: */
  std::cout << ops[4](9,3) << std::endl;

  return 0;
}
于 2012-10-25T05:20:06.953 に答える