gpt4 book ai didi

c++ - 无法将继承的类作为 SFINAE 的基础

转载 作者:太空狗 更新时间:2023-10-29 19:44:04 29 4
gpt4 key购买 nike

我创建了一个 container_traits 类来检查容器是否为 std::array。但它无法捕获从 std::array 继承的容器。有什么解决办法吗?

#include <vector>
#include <array>
#include <iostream>

using namespace std;

template<typename C>
struct container_traits { constexpr static bool is_array = false; };
template<typename T, size_t S>
struct container_traits<std::array<T,S>> { constexpr static bool is_array = true; };

template<typename T, size_t S>
struct A : public std::array<T,S> {};

int main()
{
cout << container_traits<A<int, 5>>::is_array << endl; // must return 1
cout << container_traits<std::array<int, 10>>::is_array << endl; // must return 1
cout << container_traits<std::vector<int>>::is_array << endl; // must return 0
return 0;
}

最佳答案

你可以使用 std::is_base_of:

template <typename C>
struct container_traits {
constexpr static bool is_array = false;
};

template <template <typename, std::size_t> class C,
typename T, std::size_t N>
struct container_traits<C<T,N>> {
constexpr static bool is_array = std::is_base_of<std::array<T,N>, C<T,N>>::value;
};

See it in action .

它基本上专用于任何采用两个参数的模板类型。在该特化中,is_array 的值由 std::is_base_of 确定。

关于c++ - 无法将继承的类作为 SFINAE 的基础,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15616730/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com