c++ - 如何确定强类型的基类型是否为 std::array仅使用标准库
问题描述
想要扩展base_is_char_array
任何大小的字符数组。
打开与使用完全不同的解决方案is_base_of
。但是由于我无法控制的原因,我被限制在标准库中。
除了迭代到固定的最大数组大小的东西之外,我没有想法。
#include <array>
#include <iostream>
template< class Derived > auto base_is_char_array(){
return std::is_base_of<std::array<char, 10>, Derived>::value;
}
int main() {
class tester : std::array<char, 10>{};
std::cout << base_is_char_array<tester>() << std::endl;
std::cout << base_is_char_array<int>() << std::endl;
}
解决方案
cppreference给出了一个可能的实现std::is_base_of
。您可以使用相同的技术来实现您的base_is_char_array
:
namespace details {
template <std::size_t N>
std::true_type test_ptr_convertible_to_char_array(const volatile std::array<char, N>*);
std::false_type test_ptr_convertible_to_char_array(const volatile void*);
template <typename>
auto test_base_is_char_array(...) -> std::true_type;
template <typename D>
auto test_base_is_char_array(int) ->
decltype(test_ptr_convertible_to_char_array(static_cast<D*>(nullptr)));
}
template <typename Derived>
struct base_is_char_array :
std::integral_constant<
bool,
std::is_class<Derived>::value &&
decltype(details::test_base_is_char_array<Derived>(0))::value
> { };
推荐阅读
- ansible - 更改 main.yml 中的 remote_user 角色
- javascript - 更新类型阴影节点中的属性“占位符”时出错:AndroidTextInput
- reactjs - 由于 sass-loader 导致模块无法构建错误
- javascript - 如何在 react/redux 中记住 http 请求页码
- linux - pthread_create 完成函数后退出程序
- c# - 为什么当窗口全屏或很大时 System.Windows.Forms.Timer 会自动停止?
- c++ - 在非常量成员函数中调用 const 成员函数,而它们都具有相同的函数名
- java - Selenium 无此类元素异常处理
- r - 在条形图上添加第二个 y 轴和线
- opengl - SDL 2 + OpenGL 1.3 - 无光