タイプの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なしでこのようなことを行うことはできますか?
それが良い考えかどうかはわかりませんが...楽しみのために...このページで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]
コメントを追加