如何检查类型是否为函数提供算术类型
How to check if type provides function with arithmetic type
我想检查模板中提供的类型是否有获取size_t类型和返回算术类型的方法。对于int,它看起来像
template <typename U>
struct has<U> {
template <typename T, T>
struct helper;
template <typename T>
static std::uint8_t check(helper<int (*)(size_t), &T::function_name>*);
template <typename T>
static std::uint16_t check(...);
static constexpr bool value = sizeof(check<U>(0)) == sizeof(std::uint8_t);
};
但是对于所有的算术类型,它看起来是什么样子的呢?
您可以使用现代黑魔法来实现has_something检查:
// Stolen from C++17 std::
template<typename...> using void_t = void;
template<typename T, typename = void_t<>>
struct has: std::integral_constant<bool, false> {
};
template<typename T>
struct has<T, void_t<decltype(T::function_name(std::declval<std::size_t>()))>>:
std::is_arithmetic<decltype(T::function_name(std::declval<std::size_t>()))> {
};
这里的想法是,当void_t
中的内容有效时,部分专业化更好(更专业化)。否则将使用常规默认值。在这里,我通过使用单个size_t
参数调用T::function_name
的可能性来划分所有T
。之后,我对该调用的返回类型进行额外的is_arithmetic
检查。您可能会发现这个检查仍然有点松散:function_name(float)
会通过它,因为size_t
的值可以隐式转换为float
。您可以很容易地用额外的检查来填充部分专门化,因为您知道function_name
存在,并且围绕它的检查不会触发硬编译错误。
相关文章:
- 特征::矩阵<双精度,1,3> 结构类型函数中的返回类型函数
- 将C++子类成员函数(虚拟实现)传递给 C 类型函数指针
- C++ 这里有一个返回 (24) 的布尔返回类型函数
- 使用SFINAE来检测void返回类型函数的存在
- 使用此类型函数有什么优势
- 为什么此函数通过类型函数指针调用后,呼叫明智地行为
- 如何使用无类型函数指针调用C++成员函数
- 模板返回类型函数如何在C++中工作
- 具有通用类型函数的动态库[C ]
- 如何在返回类型函数模板的专用化中使用派生类型?( "couldn't infer template argument" )
- Bon appetit :从 int 返回类型函数在 main() 中打印字符串
- 对于需要其他模板参数的类型函数的部分模板专业化
- c++错误的参数类型-函数指针
- 延迟评估模板类型函数
- 在引用或指针返回类型函数上输入
- 具有指针数据类型的非类型函数模板参数
- STL中使用的C++自定义比较类型(函数谓词与较少结构)
- C++模板基类的非类型函数模板的 using 声明
- 字符串到类型函数,模板专用化使调用统一
- 自由类型函数可以接受 Unicode 文件名吗?