残念ながら、実行できません: 非タイプのテンプレートパラメータ(文字列)が必要です。構文的に言えば、非型のテンプレートパラメータを指定する唯一の方法は型を宣言することですが、型は文字列自体の長さに依存し、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;
最大長は何ですかあなたはサポートする必要がありますか?月を求めないで、必要なものを求めてください。あなたの場合、 – Yakk
は 'sizeof(string) - 1'になります。私はこのテンプレートを見たいと思っています。 – SergeyA
@SergeyA char配列をテンプレートリストに入れる魔法の1つ?もしあなたがそれを望むなら、私はそれを掲示することができます(かなりかなりですが) – DarthRubik