【发布时间】:2014-11-08 19:57:21
【问题描述】:
现代 STL 中有std::is_base_of。它可以让我们确定第二个参数是否派生自第一个参数,或者它们是否是相同的类,否则可以确定它们之间是否没有这种关系。
是否可以确定一个类是否派生自某个具体模板类而不区分其特化涉及哪些具体实际参数?
说,我们有;
template< typename ...types >
struct B {};
和
template< typename ...types >
struct D : B< types... > {};
是否可以定义类型特征:
template< typename T > is_derived_from_B;
这样当T 是D 的任何特化时它派生自std::true_type 并且如果T 不是从B 的任何特化派生自std::false_type?
【问题讨论】:
-
@Nim 怎么用?它与标准的
std::is_base_of类型特征有足够的区别吗? -
对不起,重新格式化后才明白你的问题,忽略评论的提升部分..
-
我认为像
template< typename ...types > constexpr std::true_type helper(B< types... > const &); template< typename T > constexpr std::false_type helper(T &&); decltype(helper(std::declval< D const & >()))这样的东西是可能的,如果允许这样的重载的话。 -
@Orient 否,
T&&是完全匹配的,因此与派生到基础的转换相比,重载解决方案总是首选。 -
@Orient 你可以用指针做到这一点:coliru.stacked-crooked.com/a/9d0d5ea3d60ec5e2 但它只适用于可访问的基类。
标签: c++ c++11 traits c++14 typetraits