0

次の問題を理解して実装するのにいくつかの困難があります。

関数呼び出しを配列に格納する、つまり double の配列と double を返す関数を持っている....たとえば、配列の要素を呼び出すときに、myArray[0] としましょう。関数を呼び出す必要があります。 double を返す myArray。

double myFunction(){return mydouble}

double myArray[3];
...
cout<<myArray[2]<<endl; <- should call myFunction and return "mydouble"
4

6 に答える 6

5

C++ については、ルックアップstd::functionを参照してください。C については、関数ポインタについての詳細を参照してください。

関数ポインターは C++ でも使用できますが、.NET ほど柔軟ではありませんstd::function

C++ ソリューション:

struct MyStruct
{
    double myStructFunction() { return 2.0; }
};

std::function<double()> myArray[3];

MyStruct myStructure;

myArray[0] = []() { return 1.0; };
myArray[1] = std::bind(&MyStruct::myStructFunction, myStructure);
myArray[2] = myFunction;

for (int i = 0; i < 3; i++)
    std::cout << "Calling `myArray[" << i << "]` : " << myArray[i]() << '\n';

myArray[0]ルックアップラムダ関数の割り当て、およびmyArray[1]ルックアップの割り当て用std::bind

于 2013-03-06T09:47:52.920 に答える
3

次に、これを実現するには、関数ポインターの配列が必要です。

typedef double(*MyArray)();

MyArray MA[3];

次のように、署名付きの関数をdouble function_name()配列に格納できます。

MA[0] = MyFunction;

cout<< MA[0]()<<endl;

于 2013-03-06T09:53:57.187 に答える
1

これほど単純なものはどうですか?:

#include <iostream>
#include <map>

struct O
{
  std::map<size_t,double(*)()> m;
  double operator[](size_t index)
  {
    return m[index]();
  }
};

double mydouble = 1.25;

double myFunction()
{
  return mydouble;
}

int main()
{
  O myArray;
  myArray.m[2] = &myFunction;
  std::cout << myArray[2] << std::endl;
  return 0;
}

出力(ideone):

1.25
于 2013-03-06T10:14:27.130 に答える
1

Cでは、次の方法でそれを行うことができます:

#include <stdio.h>

/* Functions */
static double fn_0(void){return 0.;}
static double fn_1(void){return 1.;}
static double fn_2(void){return 2.;}

int main(void)
{
    /* Declaration */
    double (*pfn[])(void) = {fn_0, fn_1, fn_2};
    int i;

    for (i = 0; i < 3; i++) {
        printf("%f\n", pfn[i]()); /* Usage */
    }
    return 0;
}
于 2013-03-06T09:59:15.197 に答える
1
    double myFunction()
{
    double mydouble = 1;
  return mydouble;
}

int main()
{
  double myArray[3] = {0,0,0};
  for(int i=0;i<3;i++)
  {
    myArray[i] = myFunction();
    cout << myArray[i];
  }

}
于 2013-03-06T09:59:25.160 に答える
1

ソリューションは C と C++ で異なり、C++11 と C++11 以前でも異なります。

これらすべてで、関数へのポインターの単純な配列を使用できます。

double (*array[3])() = { &f1, &f2, &f3 };

関数を呼び出すには:

std::cout << (*array[i])() << std::endl;

問題の関数が他のデータに依存できないことを意味するため、これは非常に制限的です。このため、C では通常、次のように作成しますstruct

struct F
{
    double (*pf)( void* );
    void*    data;
};

F array[3] = { { &f1, NULL }, { &f2, someData }, { &f3, NULL } };

std::cout << (*array[i].pf)( &data ) << std::endl;

(ただし、特に数値計算では、これが過剰な場合が多くあります。主にコールバックで使用されます。)

C++ では、仮想関数 (各派生クラスでオーバーライドされる) を使用して抽象基本クラスを定義し、さまざまな派生クラスのインスタンスへのポインターを保存するオプションもあります。

class F
{
public:
    virtual ~F() {}
    virtual double operator()() const = 0;
};

F const* array[3] = { &obj1, &obj2, &obj3 };

std::cout<< (*array[i])() << std::endl;

最後に、C++11 には、std::function これらすべてをカプセル化する標準オブジェクトがあります。(ただし、これは自分で調べる必要があります。ほとんどの人と同じように、私はまだ C++11 を完全にサポートするコンパイラにアクセスできないため、これを実践することはできませんでした。)

于 2013-03-06T10:02:51.847 に答える