如何解决如何仅使用标准库确定强类型的基类型是否为 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
> { };
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。