同じ構文を使用してすべての型に対してシームレスに機能できるstd::iterator_traits::value_typeに似た構造を作成したいと思います。次のようなものがあると想像してください。
template <typename T>
struct value_type {
typedef T type;
};
#define VALUE_TYPE(T) typename value_type<T >::type
これはPODタイプで機能します。私はそれを自分のクラスに特化することができます:
struct MyClass {
typedef float value_type;
};
template <>
struct value_type<MyClass> {
typedef MyClass::value_type type;
};
ただし、理想的な世界では、余分なvalue_typeのインスタンス化は避けたいと思います。
問題はSTLイテレータにあります。イテレータ階層に到達するための専門分野が必要です。コンパイラが基本ケースを選択するため、これは失敗します。
template <>
struct value_type<std::_Iterator_base_aux> { // MSVC implementation
typedef value_type type;
};
階層の上位にあるクラス(value_typeが定義されている場所であるため、_Iterator_with_baseが最も自然です)を選択すると、すべてのイテレーター特性をテンプレート引数として指定する必要があるため、失敗します。
私がやろうとしていることはC++でも可能ですか?