2016-05-22 2 views
0

:ここ"constへのポインタ"型の特性を書くにはどうしたらいいですか?私は以下の結果を探しています

/* true */ std::cout << ptr_to_const_v<const int*> << '\n'; 
/* true */ std::cout << ptr_to_const_v<const int*const> << '\n'; 
/* false */ std::cout << ptr_to_const_v<int*> << '\n'; 
/* false */ std::cout << ptr_to_const_v<int*const> << '\n'; 

は型特性で私の試みです:

template <typename T> 
struct ptr_to_const : std::is_const<std::remove_pointer<T>> {}; 

これは偽のすべてのを与えます。

また、

template <typename T> 
struct ptr_to_const : std::is_const<const std::remove_pointer<T>> {}; 

は、これは本当のすべてのを与えます。

これは、constは型の修飾子であり、型自体には含まれていないからです。
どうすればいいですか?

+0

'ptr_to_const :: value'からどうなると思いますか? –

答えて

4

タイプ形質がstd::remove_pointerで、その形質が適用されているタイプではありません。

C++ 14:

template <typename T> 
struct ptr_to_const : std::is_const<std::remove_pointer_t<T>> {}; 
                 ^^ 

古い:

template <typename T> 
struct ptr_to_const : std::is_const<typename std::remove_pointer<T>::type> {}; 
            ^^^^^^^^^      ^^^^^^ 

しかし、あなたは、単にポインタを削除するので、あなたはTがあまりにも形質を作り、もともとポインタであったかどうかわかりません許容する。これはしていませんが、

template <typename T> 
struct ptr_to_const : std::conjunction< 
    std::is_pointer<T>, 
    std::is_const<std::remove_pointer_t<T>> 
> {}; 

あなたはまた、C++ 1Z bool_constantを選ぶと&&を使用することができます:あなたはこのC++ 1Zのラベルが付いているので、あなたは基本的に短絡メタプログラミング&&あるstd::conjunctionを、使用することができます短絡してください。

+2

'std :: remove_pointer 'は 'T'がポインタでない場合' T'を生成するので、これはポインタではないconst型についても同様です。 –

+0

@BenjaminLindley、私はちょうどそれに気づいた:) – chris

1
template<class T> 
using ptr_to_const = std::conjunction<std::is_pointer<T>, 
             std::is_const<std::remove_pointer_t<T>>>; 
関連する問題