5

私に機能があれば

int calcStuff_dynamic(const int a, const int b)

およびいくつかのテンプレート メタ コード

template<int a, int b>
struct calcStuff_static {
    static const int value = //some more code
};

ラッパーを書く方法はありますか

int calcStuff(const int a, const int b) {
    IF_THESE_ARE_KNOWN_CONSTANTS_AT_COMPILE_TIME(a, b)
        return calcStuff_static<a, b>::value;
    ELSE_TEMPLATE_WOULD_FAIL
        return calcStuff_dynamic(a, b);
}
4

2 に答える 2

1

あなたにはできませんが、スマート コンパイラによって実行されます。

おそらく最初に頭に浮かぶ解決策は、 constexpr値の組み合わせでSFINAEを使用することです。この場合、constexpr値を検出するために何かが必要です。

ただし、is_constexprコンパイル時に既知の値を検出するものはありません。一方、関数は型の一部ではないis_constため、役に立ちません。constexprしたがって、それを行うことはできません (または、少なくとも私は直接的な解決策を知りません)。

ただし、コンパイル時に既知の値の関数の最終値を計算する多くのコンパイラに最適化があることを知っていれば幸いです。例えばGCCでは「SCEV最終値置換」があります。

したがって、パラメーターが不明な場合はその動的関数を使用する必要があり、コンパイラーは希望どおりにそれを行います (可能な場合)。

于 2014-07-13T15:47:39.540 に答える
0

GCC、Clang、および Intel コンパイラはすべて__builtin_constant_pをサポートして、値がコンパイル時の定数であるかどうかをチェックし、その場合に最適化された式を提供します。

他のすべてのコンパイラでは、動的計算をフォールバックとして使用できます。(Visual Studio に相当するものがあることは知りません。)

于 2014-07-13T16:47:59.313 に答える