0

したがって、テンプレートを使用して、文字列に基づいて値を保持する静的な 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

これは実現不可能ですか、それとも何か誤解していますか?

4

3 に答える 3

1

14.1 には、非型テンプレート引数の許容可能な型がリストされています。

— 整数型または列挙型
— オブジェクトへのポインターまたは関数へのポインター —
オブジェクトへの左辺値参照または関数への左辺値参照
— メンバーへのポインター

配列は、これらのカテゴリのいずれにも当てはまりません。

14.3.2/1 は、テンプレート引数として許可されているもののカテゴリを一覧表示し、14.3.2/2 は続けて次のように述べています。

注: 文字列リテラル (2.14.5) は、これらのカテゴリのいずれの要件も満たさないため、受け入れ可能なテンプレート引数ではありません。

したがって、あなたがやろうとしていることをすることはできません。

于 2012-10-03T21:34:53.940 に答える
0

なりたい自分に近づける方法があります。おそらくこれでうまくいくでしょうが、維持するコードのレベルが余分に追加されます。

外部リンケージを使用して const char 配列を定義し、それらの配列の名前を使用してテンプレートからクラスをインスタンス化する必要があります。もちろん、実際の使用では、このコードはさまざまな .h および .cpp ファイルに分割されます。

extern const char a[] = "a";
extern const char b[] = "b";
extern const char ab[] = "ab";
extern const char abc[] = "abc";

template <const char * const  T> class Test
{
public:
    Test() {str = typename T;};
private:
    const char * str;
};


SomeFunction()
{
    Test<a> A;
    Test<b> B;
    Test<ab> AB;
    Test<abc> ABC;
}
于 2012-10-03T22:23:11.200 に答える
0

標準からはできません。

14.3.2.1:

非型、非テンプレートのテンプレート パラメータのテンプレート引数は、次のいずれかになります。

  • 整数型または列挙型の整数定数式。また
  • 非型テンプレート パラメータの名前。また
  • 関数テンプレート > および関数テンプレート ID を含むが非静的クラス メンバーを除く、外部リンケージを持つオブジェクトまたは関数のアドレス。または、対応するテンプレート パラメータが参照である場合。また
  • 5.3.1 で説明されているように表現されたメンバーへのポインター。
于 2012-10-03T21:38:39.613 に答える