次のような再試行メカニズムを実装するマクロがあります。
#define RETRY(function_name, param_list, max_attempts, retry_interval_usecs, error_var) \
do { \
int _attempt_; \
\
for (_attempt_ = 0; _attempt_ < max_attempts; _attempt_++) \
{ \
error_var = function_name param_list; \
if (error_var == SUCCESS) \
{ \
break; \
} \
\
usleep(retry_interval_usecs); \
} \
} while (0)
defines
これは機能しますが、C++ アプリケーション内では好ましくないと聞いています。
ここで、関数ポインターを引数として取る再試行関数を調べました。しかし、このコードをコンパイルできないため、何かを見逃しているようです。
注: 以下のコードは非機能的です。やりたいことを説明するために簡単なコードを投稿できると思いました。
void retry(int (*pt2Func)(void* args))
{
const int numOfRetries = 3;
int i = 1;
do
{
//Invoke the function that was passed as argument
if((*pt2Func)(args)) //COMPILER: 'args' was not declared in this scope
{
//Invocation is successful
cout << "\t try number#" << i <<" Successful \n";
break;
}
//Invocation is Not successful
cout << "\t try number#" << i <<" Not Successful \n";
++i;
if (i == 4)
{
cout<< "\t failed invocation!";
}
}while (i <= numOfRetries);
}
int Permit(int i)
{
//Permit succeeds the second retry
static int x = 0;
x++;
if (x == 2 && i ==1 ) return 1;
else return 0;
}
int main()
{
int i = 1;
int * args = &i;
retry(&Permit(args));
}
だから基本的に私の質問は:
- 異なるパラメーター (型と数) を持つ一般的な関数を再試行メソッドに渡すにはどうすればよいですか? 関数をクラス内にカプセル化せずに?
それは可能ですか?