如何编写“指向const”类型特征的指针?

时间:2016-05-22 03:34:13

标签: c++ templates const typetraits c++17

我正在寻找以下结果:

/* 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>> {};

这会提供所有 false

或者,

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

这样可以提供所有 true

我想这是因为const是类型的限定符,而不是类型本身的一部分 我该怎么办?

2 个答案:

答案 0 :(得分: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原来是否是一个指针,使得这个特性过于宽松。由于您标记了此C ++ 1z,因此可以使用std::conjunction,这基本上是一个短路元编程&&

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并使用&&,虽然这不会造成短路。

答案 1 :(得分:1)

(lldb) p String(UInt.max)
(String) $R0 = "18446744073709551615"
(lldb)