0

コンパイル時に定数を作成したい。これは私が意味することです:

template <int M = 31>
int fast_hash(int prev_hash, int c1, int c3)
{
    enum {m3 = m*m*m;}
    return m * prev_hash - m3 * c1 + c3;
}

上記の例では、関数が呼び出されるたびにm3 = m * m * mを計算できますが、これを1回だけ実行し、コンパイル時に実行すると、よりクールになると思います。これどうやってするの?

4

2 に答える 2

4

C ++ 11を使用して実行するのが最適ですconstexprが、C ++ 03でも、メタ関数を使用して実行できます。

template< int M >
struct some_calculation
{
    static const int value = M * M * M;
};

確かに涼しいですが、心配しすぎて早すぎると思います。

于 2012-05-19T00:02:02.437 に答える
2

あなたが提供するコードがC++で何をするのか誤解していると思います:

template <int M = 31>
int fast_hash(int prev_hash, int c1, int c3)
{
    enum {m3 = m*m*m;}
    return m * prev_hash - m3 * c1 + c3;
}

元のコードでは、m3はすでにコンパイル時定数(定数式)です。コンパイラーはそれを計算し、usesを値に置き換えます。列挙子の値は、定数式(コンパイル時に計算)からのみ設定できることに注意してください。

実際のところ、これは時期尚早の最適化です。ほとんどの場合、コンパイル時定数M(テンプレート引数)が与えられているため、列挙型を定義する必要はありません。すべてのコンパイラが適切な値に置き換えM*M*Mられます。これをコンパイラーに実装するのは簡単であり、製品グレードのコンパイラーがそれを失敗することはありません。

于 2012-05-19T01:54:07.243 に答える