用于检测函数类型是否为否的特征
Trait to detect if a function type is maked noexcept
我想知道是否有技巧可以简化特征的编写以返回类型是否为noexcept
函数。目前我的实现如下,它只是一一列出了所有可能性。可以使用标准C++20
以更简单的方式编写吗?
// Default
template <class>
struct is_noexcept_function: std::false_type {};
// Variable template
template <class T>
inline constexpr bool is_noexcept_function_v
= is_noexcept_function<T>::value;
// Noexcept functions
template <class R, class... Args>
struct is_noexcept_function<R(Args...) noexcept>: std::true_type {};
template <class R, class... Args>
struct is_noexcept_function<R(Args...) const noexcept>: std::true_type {};
template <class R, class... Args>
struct is_noexcept_function<R(Args...) volatile noexcept>: std::true_type {};
template <class R, class... Args>
struct is_noexcept_function<R(Args...) const volatile noexcept>: std::true_type {};
// Noexcept lvalue-ref-qualified functions
template <class R, class... Args>
struct is_noexcept_function<R(Args...) & noexcept>: std::true_type {};
template <class R, class... Args>
struct is_noexcept_function<R(Args...) const & noexcept>: std::true_type {};
template <class R, class... Args>
struct is_noexcept_function<R(Args...) volatile & noexcept>: std::true_type {};
template <class R, class... Args>
struct is_noexcept_function<R(Args...) const volatile & noexcept>: std::true_type {};
// Noexcept rvalue-ref-qualified functions
template <class R, class... Args>
struct is_noexcept_function<R(Args...) && noexcept>: std::true_type {};
template <class R, class... Args>
struct is_noexcept_function<R(Args...) const && noexcept>: std::true_type {};
template <class R, class... Args>
struct is_noexcept_function<R(Args...) volatile && noexcept>: std::true_type {};
template <class R, class... Args>
struct is_noexcept_function<R(Args...) const volatile && noexcept>: std::true_type {};
// Noexcept variadic functions
template <class R, class... Args>
struct is_noexcept_function<R(Args..., ...) noexcept>: std::true_type {};
template <class R, class... Args>
struct is_noexcept_function<R(Args..., ...) const noexcept>: std::true_type {};
template <class R, class... Args>
struct is_noexcept_function<R(Args..., ...) volatile noexcept>: std::true_type {};
template <class R, class... Args>
struct is_noexcept_function<R(Args..., ...) const volatile noexcept>: std::true_type {};
// Noexcept lvalue-ref-qualified variadic functions
template <class R, class... Args>
struct is_noexcept_function<R(Args..., ...) & noexcept>: std::true_type {};
template <class R, class... Args>
struct is_noexcept_function<R(Args..., ...) const & noexcept>: std::true_type {};
template <class R, class... Args>
struct is_noexcept_function<R(Args..., ...) volatile & noexcept>: std::true_type {};
template <class R, class... Args>
struct is_noexcept_function<R(Args..., ...) const volatile & noexcept>: std::true_type {};
// Noexcept rvalue-ref-qualified variadic functions
template <class R, class... Args>
struct is_noexcept_function<R(Args..., ...) && noexcept>: std::true_type {};
template <class R, class... Args>
struct is_noexcept_function<R(Args..., ...) const && noexcept>: std::true_type {};
template <class R, class... Args>
struct is_noexcept_function<R(Args..., ...) volatile && noexcept>: std::true_type {};
template <class R, class... Args>
struct is_noexcept_function<R(Args..., ...) const volatile && noexcept>: std::true_type {};
您的问题有两个部分:检测类型是否为函数,然后检测该函数是否为 noexcept。遗憾的是,没有更好的方法来检测类型是否为函数。即使在 20 C++也没有。您确实需要专注于恒量、易失性和参考资格的所有组合。
当 noexcept 在 C++17 中成为函数类型的一部分时,这一事实至少给一个标准库实现者带来了很大的挫败感。
在此处查看我自己的(免费(解决方案(生产级,完整文档(。这是对本文中讨论的想法的完整实现。
下载代码,将"TypeTraits.h"和"CompilerVersions.h"添加到项目中,然后执行以下操作(注意存在传递函数类型的其他方法 - 请参阅文档(。请注意,您不必显式 #include"CompilerVersions.h",它会自动 #included 在"TypeTraits.h"中。
#include "TypeTraits.h"
using namespace StdExt; // Everything's in this namespace
constexpr bool isNoexcept = IsNoexcept_v<decltype(YourFunction)>;
相关文章:
- C++类型特征,以查看是否可以<uint32_t>对类型"K"的任何变量调用"static_cast(k)"
- 编译时检查特征专用化是否具有唯一 ID
- 具有相同特征的两个对象是否只在内存中存储一次?无论定义它们的函数是什么,都是不同的
- 用于检测函数类型是否为否的特征
- 键入特征以检查类型是否可从流和 MSVC 读取
- 特征库是否修改C++语法
- 基于 SFINAE 的特征,用于确定是否支持运算符 +
- 如何构造一个类型特征,可以判断一个类型的私有方法是否可以在另一个类型的构造函数中调用?
- 特征:从数组类型中获取标量类型是否记录?
- 是否可以使用带有模板化参数的特征块表达式作为左值?
- 为什么不调用预期的函数?我是否对类型特征的理解不正确?
- 我是否可以拥有大小大于大小限制 (2^32) 的特征::VectorXd
- 特征"Sparse matrix format"示例是否包含错误?
- 是否应该避免使用不支持特征的模块?
- 是否可以从特征中的 1 开始索引矩阵?
- 现代C++的实验特征对于长期项目是否可靠?
- 特征:如何检查矩阵是否可逆
- 是否有任何类型特征控制成员类型(不是成员变量)
- 我能否确定类型特征是否具有 const 修饰符
- 我实现的Is_complete类型特征是否暴露了编译器错误