1

C++ では、コンパイル時に型を整数に変換する方法はありますか (おそらく typeid を使用)? 私の目標は、そのクラスの各タイプに一意のコードを渡すことです:

template<int TypeCode>
class MyClass
{
};

編集:私がやろうとしていることについての詳細。実際、 MyClass はもっと似ています:

template<int Code>
class AbstractBase
{
};

多くの CRTP 手法を使用して高度にテンプレート化されたコードを作成しており、一部の操作について型間の互換性を確認する必要があります。そのために、私の考えは、これらすべての型に同じコードを指定して、AbstractBase クラスから互換性のある型を継承することでした。それを使用して、単に呼び出すだけでstd::enable_if<std::is_base_of<AbstractBase<MyCode>, T>::value>::type、一部の操作の型の互換性を確認できます。

最初は手動でコードを生成することもできますが、このコードを型から自動的に生成できれば、より洗練されたものになるでしょう。

4

3 に答える 3

2

多くの方法があります。テンプレートの特殊化は次のとおりです。

#include<iostream>
using namespace std;

template<class T>   struct type_code        { enum{value=0}; };  // unknown type code
template<>          struct type_code <int>  { enum{value=1}; }; 
template<>          struct type_code <float>{ enum{value=2}; }; 

int main() {
        cout << type_code<void>::value << endl;
        cout << type_code<int>::value << endl;
        cout << type_code<float>::value << endl;
}

出力:

0
1
2
于 2012-12-19T19:59:03.357 に答える
0

私があなたを完全に理解しているかどうかはわかりません。これはあなたが話していることですか?

template<int TypeCode>
class MyClass
{
private:
    int i;
    double d;

public:
    template<typename T>
    operator T()
    {
        if(strcmp(typeid(T).name(),"int")==0)
            return i;
        else if(strcmp(typeid(T).name(),"double")==0)
            return d;
        // some other types here ...
    }
};
于 2012-12-19T20:04:07.257 に答える
0

型のリストを作成し、コンパイル時にそのリスト内の型のインデックスを抽出できます。

私の別の答えから、これがこのテクニックです:

#include <type_traits>

template<typename... Types>
struct Seq {};

template<typename T, typename Seq, typename=void>
struct IndexOf;

template<typename T, typename First, typename... Types>
struct IndexOf<T, Seq<First, Types...>, typename std::enable_if< std::is_same<T, First>::value >::type > {
  enum { value = 0 };
};
template<typename T, typename First, typename... Types>
struct IndexOf<T, Seq<First, Types...>, typename std::enable_if< !std::is_same<T, First>::value >::type > {
  enum { value = 1+IndexOf<T,Seq<Types...>>::value };
};

typedef Seq< bool, char, unsigned char, short, unsigned short, int, unsigned int, long, unsigned long > IntegerTypes;

#include <iostream>

int main() {
  std::cout << IndexOf< int, IntegerTypes >::value << "\n";
  // this next line will not compile, because void is not in the IntegerTypes sequence:
  // std::cout << IndexOf< void, IntegerTypes >::value << "\n";
}

私は整数でそれを使用しています。

したがって、整数が必要なタイプのリストがある場合は、すべてのタイプをリストするだけで、上記の手法でそれぞれに一意の整数が得られます (逆マッピングも比較的簡単です。リストへのコンパイル時のインデックスタイプ)。

于 2012-12-19T20:35:08.247 に答える