0

以下が可能かどうかはわかりません。誰かがこの要件に相当するものを与えることができますか?

if(dimension==2)
  function = function2D();
else if(dimension==3)
  function = function3D();

for(....) {
  function();
}
4

4 に答える 4

5

次の 2 つのことを仮定すると、可能です。

  1. function2D()とは両方ともfunction3D()同じ署名と戻り値の型を持ちます。
  2. functionfunction2Dと の両方と同じ戻り値の型とパラメーターを持つ関数ポインターfunction3Dです。

調査している手法は、ジャンプ テーブルの作成に使用される手法と非常によく似ています。実行時の条件に基づいて実行時に割り当てる (および呼び出す) 関数ポインターがあります。

次に例を示します。

int function2D()
{
  // ...
}

int function3D()
{ 
  // ...
}

int main()
{
  int (*function)();  // Declaration of a pointer named 'function', which is a function pointer.  The pointer points to a function returning an 'int' and takes no parameters.

  // ...
  if(dimension==2)
    function = function2D;  // note no parens here.  We want the address of the function -- not to call the function
  else if(dimension==3)
    function = function3D;

  for (...)
  {
    function();
  }
}
于 2013-10-24T18:04:13.837 に答える
4

関数ポインタを使用できます。

ここにチュートリアルがありますが、基本的には次のように宣言します。

void (*foo)(int);

ここで、関数には 1 つの整数引数があります。

次に、次のように呼び出します。

void my_int_func(int x)
{
    printf( "%d\n", x );
}


int main()
{
    void (*foo)(int);
    foo = &my_int_func;

    /* call my_int_func (note that you do not need to write (*foo)(2) ) */
    foo( 2 );
    /* but if you want to, you may */
    (*foo)( 2 );

    return 0;
}

したがって、関数の引数の数と型が同じである限り、必要なことを実行できるはずです。

于 2013-10-24T18:02:00.823 に答える
2

これは C++ とタグ付けされているため、std::functionにアクセスできる場合C++11、またはstd::tr1::functionコンパイラが C++98/03 および TR1 をサポートしている場合に使用できます。

int function2d();
int function3D(); 

int main() {
    std::function<int (void)> f; // replace this with the signature you require.
    if (dimension == 2)
        f = function2D;
    else if (dimension == 3)
        f = function3D;
    int result = f(); // Call the function.
}

他の回答で述べたように、関数に同じ署名があり、すべてがうまくいくことを確認してください。

std::functionコンパイラがまたはを提供しない場合はstd::tr1::function、常にboost ライブラリがあります。

于 2013-10-24T18:04:52.640 に答える
1

C++ を選択したため

ここstd::functionにC++ 11の例があります

#include <functional>
#include <iostream>

int function2D( void )
{
  // ...
}

int function3D( void ) 
{ 
  // ...
}

int main()
{

    std::function<int(void)> fun = function2D;

    fun();

}
于 2013-10-24T18:07:53.830 に答える