我使用C++20。我可以检查类型是否是somevector / deque / list,如下所示:
template <typename N> struct is_listish_trait {
static constexpr bool value = 0;
};
/* These are listish specializations */
template <typename N, typename A> struct is_listish_trait<std::vector<N, A>> {
static constexpr bool value = 1;
};
template <typename N, typename A> struct is_listish_trait<std::list<N, A>> {
static constexpr bool value = 1;
};
template <typename N, typename A> struct is_listish_trait<std::deque<N, A>> {
static constexpr bool value = 1;
};
template <typename T>
static constexpr bool is_listish = is_listish_trait<T>::value;
static_assert(!is_listish<int>);
static_assert(is_listish<std::vector<int>>);
字符串
(我想知道在C++20中是否有更好的方法来做到这一点,现在我们有了requires
表达式等。
然而,现在我想要的是is_listish
接受从vectors / lists / deques派生的类。例如:
struct MyVec : public std::vector<int> { };
static_assert(is_listish<MyVec>); //This should be true
型
我不确定这是否可行。这是我试过的:
template <typename B, typename D>
requires std::is_base_of_v<B, D>
struct is_listish_trait<D> {
static constexpr bool value = 1;
};
型
然而,编译器抱怨说它不能推导出B(这是可以理解的)。
怎么能这样呢?
2条答案
按热度按时间nuypyhwy1#
使用
requires
,您可以:字符串
Demo
mf98qq942#
现在我想要的是
is_listish
接受从vectors / lists / deques派生的类。你可以简单地在
requires
子句中明确说明这一点。你要求所讨论的类型有一个基类std::vector
。你只需要指定合适的值和分配器类型。幸运的是,std::vector
将它们作为成员类型提供。(如果这些成员类型不存在,那么这种特殊化不应该也不会适用。)* 如果一个类有多个提供这些成员类型的基类,这种方法将失败。*字符串
类似的还有list和deque。