2016-06-18 13 views
1

これはcharの配列をとり、それをテンプレートパラメータリストに変換する魔法のtemplateがあるとします。たとえば:"thing"list<'t','h','i','n','g'>に翻訳されていますテンプレートの文字列の長さを暗黙的に取る

template<const char*, size_t> 
ArrayToList; 

あなたはこのようにそれを使用します。

constexpr char string[] = "this is a test"; 
typedef ArrayToList<string,14> list; 

私がしなければならないすべてはあるように何とか暗黙的に文字列の長さを検出する方法はあります

+0

最大長は何ですかあなたはサポートする必要がありますか?月を求めないで、必要なものを求めてください。あなたの場合、 – Yakk

+0

は 'sizeof(string) - 1'になります。私はこのテンプレートを見たいと思っています。 – SergeyA

+0

@SergeyA char配列をテンプレートリストに入れる魔法の1つ?もしあなたがそれを望むなら、私はそれを掲示することができます(かなりかなりですが) – DarthRubik

答えて

0

残念ながら、実行できません: 非タイプのテンプレートパラメータ(文字列)が必要です。構文的に言えば、非型のテンプレートパラメータを指定する唯一の方法は型を宣言することですが、型は文字列自体の長さに依存し、2つのテンプレートパラメータ(長さと文字列)が必要です。文字列をconst char *に設定すると、文字列の長さはパラメータで失われます。

あなたの場合のように余分なテンプレート引数の構文を強制するのを防ぐために、型パラメータ自体にテンプレートパラメータが必要な非型テンプレートパラメータの取得を可能にする提案があります。

メンバーへのポインタをキャプチャしようとするのと同じ種類の問題がありましたが、集約が何であるかを言う必要があります。

一つの推薦:あなたはArrayToListに引数の順序を元に戻す場合は、私はあなたがここにとして、その長さと非型パラメータをキャプチャすることにより、コードを簡略化することができると思います。

template<char...> struct list {}; 

// just a declaration 
template<char, typename> struct add_to_list; 

// specializes for the case of a list of chars, to insert v 
template<char v, char... pack> struct add_to_list<v, list<pack...>> { 
    using type = list<v, pack...>; 
}; 

// captures str[length - rindex] into the head of the list 
template<unsigned rindex, unsigned length, const char str[length]> 
    struct to_list { 
    using type = typename add_to_list< 
     str[length - rindex], 
     typename to_list<rindex - 1, length, str>::type 
    >::type; 
    }; 

// base of the recursion 
template<unsigned length, const char str[length]> 
    struct to_list<1, length, str> { 
    using type = list<>; 
    }; 

template<unsigned string_length, const char str[string_length]> 
    using ArrayToList = 
    typename to_list<string_length, string_length, str>::type; 


// now, an example 
constexpr char str[] = "hello"; 


template<typename> struct show_type_in_error; 
show_type_in_error<ArrayToList<sizeof(str), str>> error; 
関連する問題