27

を使用してキャストconst char*するコードをいくつか書いたので、テンプレート引数として aを使用できます。コードは次のとおりです。intconstexprconst char*

#include <iostream>

class conststr
{
    public:
        template<std::size_t N>
        constexpr conststr(const char(&STR)[N])
        :string(STR), size(N-1)
        {}

        constexpr conststr(const char* STR, std::size_t N)
        :string(STR), size(N)
        {}

        constexpr char operator[](std::size_t n)
        {
            return n < size ? string[n] : 0;
        }

        constexpr std::size_t get_size()
        {
            return size;
        }

        constexpr const char* get_string()
        {
            return string;
        }

        //This method is related with Fowler–Noll–Vo hash function
        constexpr unsigned hash(int n=0, unsigned h=2166136261)
        {
            return n == size ? h : hash(n+1,(h * 16777619) ^ (string[n]));
        }

    private:
        const char* string;
        std::size_t size;
};

// output function that requires a compile-time constant, for testing
template<int N> struct OUT
{
    OUT() { std::cout << N << '\n'; }
};

int constexpr operator "" _const(const char* str, size_t sz)
{
    return conststr(str,sz).hash();
}

int main()
{
    OUT<"A dummy string"_const> out;
    OUT<"A very long template parameter as a const char*"_const> out2;
}

このコード例では、 type of outisOUT<1494474505>と type of out2isOUT<106227495>です。このコードの背後にある魔法は、 FNV ハッシュ関数conststr::hash()を使用するconstexpr再帰です。したがって、これは const char* の整数ハッシュを作成します。これは、うまくいけば一意のものです。 この方法についていくつか質問があります。


  1. これは安全に使用できる方法ですか?それとも、このアプローチは特定の用途で悪になる可能性がありますか?
  2. 文字数に制限されることなく、文字列ごとに異なる整数を作成する、より優れたハッシュ関数を作成できますか? (私の方法では、長さは十分です)
  3. 暗黙的に via にキャストするコードを作成して、const char*美的int constexprconststr醜い (そして時間の消費者でもある)_constユーザー定義の文字列リテラルを必要としないようにすることはできますか? たとえば、OUT<"String">合法です(そして「文字列」を整数にキャストします)。

どんな助けでも大歓迎です、どうもありがとう。

4

2 に答える 2

8

テンプレートの const 文字列パラメーターに使用しているパターンを次に示します。 class F { static constexpr const char conststr[]= "some const string"; TemplateObject<conststr> instance; };

参照: https://stackoverflow.com/a/18031951/782168

于 2015-08-02T14:03:15.370 に答える