在非特定模板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取决于是否存在另一个成员类型。
答案 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");