以下が可能かどうかはわかりません。誰かがこの要件に相当するものを与えることができますか?
if(dimension==2)
function = function2D();
else if(dimension==3)
function = function3D();
for(....) {
function();
}
以下が可能かどうかはわかりません。誰かがこの要件に相当するものを与えることができますか?
if(dimension==2)
function = function2D();
else if(dimension==3)
function = function3D();
for(....) {
function();
}
次の 2 つのことを仮定すると、可能です。
function2D()
とは両方ともfunction3D()
同じ署名と戻り値の型を持ちます。function
function2D
と の両方と同じ戻り値の型とパラメーターを持つ関数ポインター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();
}
}
関数ポインタを使用できます。
ここにチュートリアルがありますが、基本的には次のように宣言します。
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;
}
したがって、関数の引数の数と型が同じである限り、必要なことを実行できるはずです。
これは 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 ライブラリがあります。
C++ を選択したため
ここstd::function
にC++ 11の例があります
#include <functional>
#include <iostream>
int function2D( void )
{
// ...
}
int function3D( void )
{
// ...
}
int main()
{
std::function<int(void)> fun = function2D;
fun();
}