5

C++03 で別の型の「逆参照型」を取得するにはどうすればよいですか? のような他の逆参照可能な型にすることができることに注意してくださいstd::vector<int>::iterator

たとえば、私が持っている場合

template<typename T>
struct MyPointer
{
    T p;
    ??? operator *() { return *p; }
};

を何に置き換えるかはどうすればわかり???ますか?

( No Boost ! 自分で計算する方法を知りたいです。)

4

4 に答える 4

11
template<typename>
struct dereference;

template<typename T>
struct dereference<T*>
{
    typedef typename T type;
};

template<typename T>
struct MyPointer
{
    T p;
    typename dereference<T>::type operator *() { return *p; }
};
于 2011-09-04T20:59:27.247 に答える
2

一般的な場合、できません。生のポインターの場合、他の回答に示されているように部分的に特殊化できます。カスタム スマート ポインターは、結果の型に対して共通の typedef を持つ場合があります。ただし、C++03 では、任意のポインターに対応する単一の関数を作成することはできません。

于 2011-09-04T21:20:03.213 に答える
1

以下のように、特定の型からすべてのポインターを再帰的に削除する単純な構造を持つことができます。

template<typename T>
struct ActualType { typedef T type; };
template<typename T>
struct ActualType<T*> { typedef typename ActualType<T>::type type; };

以下は、指定されたポインターまたは非ポインター型から実際の値を再帰的に見つけるインライン ラッパー関数です。

template<typename T>
typename ActualType<T>::type ActualValue (const T &obj) { return obj; }
template<typename T>
typename ActualType<T>::type ActualValue (T *p) { return ActualValue(*p); }

そして、それを次のように使用してください:

template<typename T>
struct MyPointer
{
  T p;
  typename ActualType<T>::type operator *() { return ActualValue(p); }
//^^^^^^^^^^^^^^^^^^^^^^^^^^^^                       ^^^^^^^^^^^^^^
};

この例では、特定の型からすべてのポインターを削除しますが、必要に応じてActualType<>およびを構成できますActualValue<>MyPointer<>ポインタ型以外で宣言してもコンパイルエラーにはなりません。

これは、単一のポインターとポインター型なしの動作デモです。

于 2013-01-23T03:12:33.027 に答える
0

次のようにすると、ポインタを渡した場合にのみテンプレートがコンパイルされることが保証されます。

template<typename T>
struct MyPointer<T*>
{
    T* p;
    T operator*() { return *p; }
}
于 2011-09-04T21:00:24.483 に答える