したがって、テンプレートを使用して、文字列に基づいて値を保持する静的な const コンパイル時の構造体を作成できるようにしたいと考えています。私は4文字までしか望みません。「abcd」の型はint
であり、「ab」、「abc」も同様であり、「a」は型char
ですが、template<int v> struct
私がやりたいのは、2、3、4、5 の const char のサイズ「abcd」を取り、「abcd」を使用した場合と同じ機能を持つことです。ヌル ターミネータが必要なため、1、2、3、または 4 を意味するわけではないことに注意してください。
cout << typeid("abcd").name() << endl;
このハードコードされた文字列の型はchar const [5]
であり、末尾に null ターミネータが含まれていることがわかります。
値を文字としていじる必要があることを理解しているため、整数として表されます。
VS10は対応していないので使えconstexpr
ません(VS11も対応していません..)
したがって、たとえば、このテンプレートが定義された場所で、後で最後の行
template <int v> struct something {
static const int value = v;
};
//Eventually in some method
cout << typeid(something<'abcd'>::value).name() << endl;
うまく動作します。
私はもう試した
template<char v[5]> struct something2 {
static const int value = v[0];
}
template<char const v[5]> struct something2 {
static const int value = v[0];
}
template<const char v[5]> struct something2 {
static const int value = v[0];
}
それらはすべて個別にビルドされますが、テストを投入すると、
cout << typeid(something2<"abcd">::value).name() << endl;
私は得る
'something2' : invalid expression as a template argument for 'v'
'something2' : use of class template requires template argument list
これは実現不可能ですか、それとも何か誤解していますか?