タイプのC ++ constexpr値

ピーターレンケフィ

タイプのIDに対してswitchステートメントを作成できるようにしたい。さまざまなタイプに一意のIDを与えることができるメカニズムを見つけました。それは非常に簡単です:

template <typename T>
struct type { 
    static void id() { } 
};

template <typename T>
constexpr const size_t type_id() {
    return reinterpret_cast<size_t>(&type<T>::id); 
}

これは、スイッチのケースとして使用できる定数に評価されると思いました。しかし、次のようにすると、case式が定数ではないというエラーが発生します。

int main(void) {
    size_t a = type_id<int>();
    switch (a) {
    case type_id<int>():
        break;
    }
    return 0;
}

なぜそれは定数ではないのですか?どうすればこの効果を達成できますか?

編集:

その後、reinterpret_castなしでこのようなことを行うことはできますか?

max66

それが良い考えかどうかはわかりませんが...楽しみのために...このページconstexpr提案さているカウンターを使用すると、ポインターの値を置き換えることができるはずです。

以下は(繰り返します:ただの楽しみのために)完全な実験です

#include <iostream>

template <int N>
struct flag
 { friend constexpr int adl_flag (flag<N>); };

template <int N>
struct writer
 {
   friend constexpr int adl_flag (flag<N>)
    { return N; }

   static constexpr int value { N };
 };

template <int N, int = adl_flag (flag<N> {})>
int constexpr reader (int, flag<N>)
 { return N; }

template <int N>
int constexpr reader (float, flag<N>, int R = reader (0, flag<N-1> {}))
 { return R; }

int constexpr reader (float, flag<0>)
 { return 0; }

template <int N = 1>
int constexpr next (int R = writer<reader (0, flag<32> {}) + N>::value)
 { return R; }

template <typename T>
struct type
 { 
   static constexpr int id { next() };

   constexpr static int type_id ()
    { return id; }
 };

void printType (int idT )
 {
   switch ( idT )
    {
      case type<int>::type_id():
         std::cout << "- int type" << std::endl;
         break;

      case type<long>::id:
         std::cout << "- long type" << std::endl;
         break;

      default:
         std::cout << "- another type" << std::endl;
         break;
    }
 }

int main ()
 {
   int ii { type<int>::id };
   int il { type<long>::type_id() };

   printType(ii);
   printType(il);
 }

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

constexpr値のデータ構造

分類Dev

C ++ constexprタイプID

分類Dev

テンプレートタイプのC ++ Constexprメンバー

分類Dev

ポインタ型の非型テンプレートパラメータとしてのConstexpr値

分類Dev

Clangは、コンパイル時に非constexpr変数のconstexpr関数の値を評価しません

分類Dev

タイプのconstexprチェック

分類Dev

POD構造体の値の初期化はconstexprですか?

分類Dev

constexpr値がある場合のcoutの評価?

分類Dev

C ++のConstexprイテレータ

分類Dev

constexpr関数には1つの引数値が必要ですか?

分類Dev

参照によって渡された値のconstexpr

分類Dev

constexprはどのように値を推定しますか?

分類Dev

C ++ 14:パラメーター値からconstexpr変数を初期化する

分類Dev

constexpr関数の戻り値をキャプチャする変数からconstexprを削除すると、コンパイル時の評価が削除されます

分類Dev

C ++ constexpr-値はコンパイル時に評価できますか?

分類Dev

forループで値を2倍にするためのconstexprが必要

分類Dev

コンパイル時に静的constexpr配列の最小/最大値を取得する

分類Dev

コンパイル時に静的constexpr配列の最小/最大値を取得する

分類Dev

Constexpr変数はコンパイル時の値ではありませんか?

分類Dev

C ++ 11は、constexpr関数の均一な値で配列を初期化します

分類Dev

C ++ 14の「constexpr」

分類Dev

C ++特定の値タイプのイテレータはありますか?

分類Dev

任意のタイプの値を保持するC ++ std :: map

分類Dev

C#の数値タイプへの参照?

分類Dev

Javaタイプ、値の比較

分類Dev

グローバルconstexpr変数の一意の値を生成します

分類Dev

std :: bitsetがconstexpr値のみを取るのはなぜですか?

分類Dev

constexprを削除すると、gccの配列の値が変更されます

分類Dev

constexprで `__func__`の値を取得することは可能ですか?

Related 関連記事

  1. 1

    constexpr値のデータ構造

  2. 2

    C ++ constexprタイプID

  3. 3

    テンプレートタイプのC ++ Constexprメンバー

  4. 4

    ポインタ型の非型テンプレートパラメータとしてのConstexpr値

  5. 5

    Clangは、コンパイル時に非constexpr変数のconstexpr関数の値を評価しません

  6. 6

    タイプのconstexprチェック

  7. 7

    POD構造体の値の初期化はconstexprですか?

  8. 8

    constexpr値がある場合のcoutの評価?

  9. 9

    C ++のConstexprイテレータ

  10. 10

    constexpr関数には1つの引数値が必要ですか?

  11. 11

    参照によって渡された値のconstexpr

  12. 12

    constexprはどのように値を推定しますか?

  13. 13

    C ++ 14:パラメーター値からconstexpr変数を初期化する

  14. 14

    constexpr関数の戻り値をキャプチャする変数からconstexprを削除すると、コンパイル時の評価が削除されます

  15. 15

    C ++ constexpr-値はコンパイル時に評価できますか?

  16. 16

    forループで値を2倍にするためのconstexprが必要

  17. 17

    コンパイル時に静的constexpr配列の最小/最大値を取得する

  18. 18

    コンパイル時に静的constexpr配列の最小/最大値を取得する

  19. 19

    Constexpr変数はコンパイル時の値ではありませんか?

  20. 20

    C ++ 11は、constexpr関数の均一な値で配列を初期化します

  21. 21

    C ++ 14の「constexpr」

  22. 22

    C ++特定の値タイプのイテレータはありますか?

  23. 23

    任意のタイプの値を保持するC ++ std :: map

  24. 24

    C#の数値タイプへの参照?

  25. 25

    Javaタイプ、値の比較

  26. 26

    グローバルconstexpr変数の一意の値を生成します

  27. 27

    std :: bitsetがconstexpr値のみを取るのはなぜですか?

  28. 28

    constexprを削除すると、gccの配列の値が変更されます

  29. 29

    constexprで `__func__`の値を取得することは可能ですか?

ホットタグ

アーカイブ