1

非再帰的な可変個引数のテンプレート化されたメソッドから呼び出される再帰的な可変個引数のテンプレート化されたメソッドがあります(おそらく関連性はありませんが、念のために言及します)。

template < class T, class UnaryPredicate, typename... UnaryPredicates >
static bool checkPredicate( const T obj,
                            const UnaryPredicate& p,
                            UnaryPredicates... predicates )
{
    bool output = p( obj );
    if ( output && sizeof...( UnaryPredicates ) ) {
        output = checkPredicate( obj, predicates... );  //  The problem line.
    }

    return output;
}

ただし、次のコマンドで呼び出された場合:

.. = checkPredicate< Sy_simObject*, VisiblePredicate< Sy_simObject* >( .. );

次のエラーが発生します。

エラー:「Sy_project :: checkPredicate(Sy_simObject * const&)」の呼び出しに一致する関数がありません

UnaryPredicatesエラーが空であることを示していることを理解しています。オーバーロードはありませんT。これを挿入すれば、正常にコンパイルされます。しかし、条件付きのチェックでそれがどのようにそこまで到達できたのか理解できませんか?sizeof...( UnaryPredicates )確かに、これ以上存在しなかった場合、それはfalseと評価され、再帰は終了しますか?

オーバーロードを追加するだけで修正できます。なぜ今は機能しないのかを本当に理解したいのです。

4

1 に答える 1

4

if(cond) { body }の場合はランタイムだからです。コンパイラがコンパイル時に実行時に分岐する必要がないことを事前に知ることができるという事実は、生成されたコードを最適化するために使用できますが、コードの特定の部分について文句を言うかどうかに影響を与えてはなりません。

のコードbodyが無効である場合condfalseコンパイラは文句を言います。探しているのは静的なifで、コードの特定の部分がコンパイラーによって処理されるかどうかを制御します。次のC++バージョンではそのようなものの提案がありますが、現在のC++にはそのような構造がありません。

于 2012-08-03T18:52:00.070 に答える