检测<T>某些非数字类型 T 的 std::numeric::type 的特化
Detecting specialization of std::numeric::type<T> for some non numeric type T
我想检查一个类型是否有 std::numeric_limits 中的条目。 当类型是数组时 - (或者可能不是数字?我收到编译器错误。 这使我无法根据 std::numeric_limits 中是否支持该类型进行检测和分支。 我将不胜感激任何人想分享的任何见解。
// the following provokes compiler error on Clang
// Function cannot return array type 'type' (aka 'char [20]')
static_assert(
! std::numeric_limits<char[20]>::is_specialized,
"! std::numeric_limits<char[20]>::is_specialized"
);
// invokes static assert on compile as expected
static_assert(
std::numeric_limits<char[20]>::is_specialized,
"std::numeric_limits<char[20]>::is_specialized"
);
发生这种情况是因为如果您查看内部std::numeric_limits
或查看文档,您将看到如下所示的方法声明
template<class T>
class numeric_limits
{
public:
static constexpr bool is_specialized = false;
static constexpr T min() noexcept;
static constexpr T max() noexcept;
static constexpr T lowest() noexcept;
在这里,如您所见,有些函数按值返回T
,C++不支持按值返回数组类型(请参阅为什么C++不支持返回数组的函数?
所以下面的行不会编译
std::numeric_limits<char[20]>::is_specialized
任何直接检查is_specialized
是否适用于直接使用 SFINAE 的类型的任何进一步尝试都不会编译,因为会产生错误(因为如上所述返回数组类型)不在模板的直接上下文中。 因此,您需要检查std::numeric_limits
支持的概念(在本例中为std::is_arithmetic
)
但是,要完成这项工作,您需要做的就是std::decay_t
类型
std::numeric_limits<std::decay_t<char[20]>>::is_specialized
现在它将起作用,因为您已将数组类型显式衰减为指针,并且可以从函数返回。 您可能首先想这样做,因为您不想意外地为像const int&
这样的非衰减类型调用std::numeric_limits::is_specialized
相关文章:
- 使用std::multimap迭代器创建std::list
- C++中std::resize(n)和std::shrink_to_fit之间的区别
- 来自 std::list 的迭代器 .end() 按预期返回"0xcdcdcdcdcdcdcdcd"但 .begin()
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 如何导出包含具有"std::unique_ptr"值的"std::map"属性的
- 从持续时间构造std::chrono::system_clock::time_point
- std::具有相同基类的类的变体
- std::向量与传递值的动态数组
- 使用std::vector的OpenCL矩阵乘法
- std::map<struct,struct>::find 找不到匹配项,但是如果我循环通过 begin() 到 end(),我在那里看到匹配项
- std::condition_variable::wait()如何评估给定的谓词
- 如何获取std::result_of函数的返回类型
- std::原子加载和存储都需要吗
- 将对象移动到std::shared_ptr
- POCO::PostgreSQL:如何将std::vector支持添加到`Binder::bind`
- 使用一个考虑到std::map中键值的滚动或换行的键
- 如何从 std::atomic 中提取指针 T<T>?
- 为什么 std::unique 不调用 std::sort?
- 使用std::函数映射对象方法
- 检测<T>某些非数字类型 T 的 std::numeric::type 的特化