私はこのようなコードを持っている:(C++ 11では)マクロなしでこれを行うことはできますか?
はvoid function()
{
auto isOk=task(1);
if(!isOk)
{
return;
}
// more code here
auto isOk=task(2);
if(!isOk)
{
return;
}
// more code here
auto isOk=task(3);
if(!isOk)
{
return;
}
// more code here
auto isOk=task(4);
if(!isOk)
{
return;
}
// more code here
auto isOk=task(5);
if(!isOk)
{
return;
}
// more code here
auto isOk=task(6);
if(!isOk)
{
return;
}
// more code here
auto isOk=task(7);
if(!isOk)
{
return;
}
// more code here
auto isOk=task(8);
if(!isOk)
{
return;
}
// more code here
auto isOk=task(9);
if(!isOk)
{
return;
}
}
私がループ内でそれらを置くことができないことに留意すべきである
(私のコードは、これに似ているがない、まさにこのコードは)
ザ・ブロックが非常にある場合醜いと私は次のようにそれを書くためにベールことがあります
#define TASK(x) {if(!task(x)) return;}
void function()
{
TASK(1);
// more code here
TASK(2);
// more code here
TASK(3);
// more code here
TASK(4);
// more code here
TASK(5);
// more code here
TASK(6);
// more code here
TASK(7);
// more code here
TASK(8);
// more code here
TASK(9);
}
私の質問は次のとおりです。
は、私はC++ 11を使用していたときにこれを行うに任意のより良い方法はありますか?
このコードの問題点は次のとおりです。
簡単にデバッグできません。
マクロは名前空間内になく、他のマクロと競合する可能性があります。
アップデート1
ここでは答えのほとんどは、私は一般的な解決策を探していたときに、特定のコードで問題を解決しようとすると、私はこのコードに関連specifc質問求めています:
1 - ラムダを使ってマクロを模倣することはできますか?
2マクロを模倣するためにconstexprを使用できますか?
3私は簡単にそれらをデバッグすることができるので、(マクロと同じ結果)コンパイラフレンドリーな方法でMACROを模倣するための他の方法?私は、ベクターにところで呼び出したタスクを実行するためのコードを配置して、ループ実行します
'タスク(1)&&タスク(2)&&タスクを(3)&& ...'? –
ブール演算子 '&&'が短絡していることに注意してください。つまり、これらのチェーンを '&&'の大きなチェーンで連鎖させることができ、最初の関数が失敗すると、残りの関数は呼び出されません。 –
@KerrekSB:それは良いですが、私はタスクを呼び出す間にいくつかのコードがあるとは言及していませんでした。私はそれを提示するためにサンプルコードを更新するつもりです。残念ながら、あなたの解決策は適切ではありません。 (これは、元の質問で説明したようにループ上に置くことができない理由です) – mans