如何仅使用标准库确定强类型的基类型是否为 std::array<char, N>

问题描述

想要为任意大小的字符数组扩展 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
    > { };

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...