当前位置:  开发笔记 > 编程语言 > 正文

“条件”别名模板

如何解决《“条件”别名模板》经验,为你挑选了1个好方法。

在像非专用模板struct pointer_traits(即template struct pointer_traits)这样的类型中,存在一个成员别名模板rebind,该模板定义为Ptr::rebind,如果存在,则为其他类型。尽管我在检查某个成员是否存在时看到了一些答案,但是如何实现一个“条件”别名模板,如pointer_traits::rebind?也就是说,就像通过以下伪C ++:

template  using type = has_type ? int : float;

要么

template  using type = if_has_type::type;

我考虑使用类似https://en.wikibooks.org/wiki/More_C%2B%2B_Idioms/Member_Detector(“检测成员类型”一节)中描述的方法,但是我不知道如何实现其帮助结构[唯一]成员类型取决于另一个成员类型的存在。



1> DeiDei..:

通过使用std::conditionalfrom 。就像这样简单:

using type = typename std::conditional::type;

要么

using type = std::conditional_t;

在这里bool用某种条件替换,可以在编译时将其评估为布尔值。在这种情况下,条件是检查现有成员。

如果条件为truetype,则成为type的别名int,否则为float

完整示例(检查是否difference_type为成员类型。)

namespace detail {

template
using ptrait_diff = typename Ptr::difference_type;

template::value>
struct ptrait_diff_t { 
    using type = ptrdiff_t;
};

template
struct ptrait_diff_t {
    using type = typename Ptr::difference_type;
};

} // namespace detail

然后:

template
struct pointer_traits
{
    using difference_type = typename detail::ptrait_diff_t::type;
};

的执行is_detected可以在这里找到。

推荐阅读
手机用户2402851155
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有