1

次のようなタイプに問題があります。

T******************************************

そのようなタイプをまったく処理できるはずstd::remove_pointerです(私はそうは思いません)?すべてを削除する方法は*?最後に1つまたは2つのアンパサンドが&追加されている場合、とメタ関数の両方を使用せずC++11にそのようなタイプを削除するための標準からのメタ関数はありますか?Tstd::remove_referencestd::remove_pointer

4

1 に答える 1

10

*s とs の数に関係なく、基本型を返すメタ関数を作成するのはそれほど難しくありません&

template <typename T>
struct remove_all_ref_ptr { typedef T type; };

template <typename T>
struct remove_all_ref_ptr<T *> : public remove_all_ref_ptr<T> { };

template <typename T>
struct remove_all_ref_ptr<T * const> : public remove_all_ref_ptr<T> { };

template <typename T>
struct remove_all_ref_ptr<T * volatile> : public remove_all_ref_ptr<T> { };

template <typename T>
struct remove_all_ref_ptr<T * const volatile> : public remove_all_ref_ptr<T> { };

template <typename T>
struct remove_all_ref_ptr<T &> : public remove_all_ref_ptr<T> { };

template <typename T>
struct remove_all_ref_ptr<T &&> : public remove_all_ref_ptr<T> { };

そして::std::remove_pointer、そのようなタイプをうまく処理できます。それは単一の*.

先ほど書いた小さなメタ関数は、最終的に再帰の深さの制限に達します。しかし、それを実現するには、おそらく 100 を超える費用を負担する必要があります*

const および volatile 修飾子も削除するために、標準ライブラリのメタ関数と組み合わせて使用​​する方法を次に示します。

 #include <type_traits>

 template <typename T>
 struct base_type : public ::std::remove_cv<typename remove_all_ref_ptr<T>::type> { };
于 2013-02-19T07:20:19.110 に答える