for
異なる関数を同じループに埋め込む必要があるプログラムを C++ で作成しています。
例:
for(i = 0; i < N_ITER; i++) {
/* ... */
function_A();
/* ... */
}
for(i = 0; i < N_ITER; i++) {
/* ... */
function_B();
/* ... */
}
パフォーマンスを考慮して、この関数にインライン化する必要がありfunction_A
ます。function_B
私の最初の解決策は、次のようにファンクターと関数テンプレートを使用することです。
class function_A {
public:
void operator()() {
/* ... */
}
};
class function_B {
public:
void operator()() {
/* ... */
}
};
template <class T>
class run {
public:
void operator()() {
/* ... */
T func;
for (i = 0; i < N_ITER; i++) {
/* ... */
func();
/* ... */
}
/* ... */
}
};
そして、次のような関数を呼び出すことができます:
run<function_A>()();
run<function_B>()();
class xxx { public: void operator()() {...} };
しかしすぐに、コード内に重複したファンクター定義が多すぎて、ぎこちなく見えることがわかりました。
だから私はラムダを使って解決策になりました:
auto function_A = []()
{
/* ... */
};
auto function_B = []()
{
/* ... */
};
template <class T>
class run {
public:
T func;
run(T func) : func(func) {}
void operator()() {
/* ... */
for (i = 0; i < N_ITER; i++) {
/* ... */
func();
/* ... */
}
/* ... */
}
};
しかし、今回はこれらの関数を呼び出すのが難しくなります:
run<decltype(function_A)> funcA(function_A); funcA();
run<decltype(function_A)> funcB(function_A); funcB();
そして、それは前の解決策ほど明確ではありません。
C ++で実装するよりエレガントな方法はありますか? 何か不足していますか?任意の提案をいただければ幸いです!!!