"条件"别名模板

时间:2017-01-18 16:09:06

标签: c++ templates template-meta-programming sfinae

在非特定模板struct pointer_traits(即template <class Ptr> struct pointer_traits)之类的类型中,存在成员别名模板rebind,如果存在则定义为Ptr::rebind<U>或者其他类型的其他类型。虽然我已经看到检查某些成员是否存在的一些答案,但是如何实现&#34;条件&#34;别名模板如pointer_traits::rebind?也就是说,好像通过以下伪C ++:

template <typename T> using type = has_type<T::U> ? int : float;

template <typename T> using type = if_has_type<T::U, int, float>::type;

我考虑过使用类似于https://en.wikibooks.org/wiki/More_C%2B%2B_Idioms/Member_Detector所描述的方法(部分&#34;检测成员类型&#34;),但我不知道如何实现其[唯一]成员的辅助结构type取决于是否存在另一个成员类型。

2 个答案:

答案 0 :(得分:6)

使用<type_traits>中的using type = typename std::conditional<bool, int, float>::type; 。它很简单:

using type = std::conditional_t<bool, int, float>;

bool

用某种条件替换true,在编译时可以计算为布尔值。在这种情况下,条件是检查现有成员。

如果条件为int,则类型将成为float的别名,否则为difference_type

完整示例(检查namespace detail { template<class Ptr> using ptrait_diff = typename Ptr::difference_type; template<class Ptr, bool = is_detected<ptrait_diff, Ptr>::value> struct ptrait_diff_t { using type = ptrdiff_t; }; template<class Ptr> struct ptrait_diff_t<Ptr, true> { using type = typename Ptr::difference_type; }; } // namespace detail 是否为会员类型。)

template<class Ptr>
struct pointer_traits
{
    using difference_type = typename detail::ptrait_diff_t<Ptr>::type;
};

然后:

is_detected

可以找到export class Test2 { ... } ... import * as TEST from './test'; new TEST.Test2(...) 的{​​{3}}。

答案 1 :(得分:3)

这是std::conditional旨在解决的问题。

#include <type_traits>
template<bool condition> 
using type = std::conditional_t<condition, int, float>;

static_assert(std::is_same<type<true>,  int>::value,   "type<true> should be int");
static_assert(std::is_same<type<false>, float>::value, "type<false> should be float");