我可以通过继承或嵌套的typedef来编写递归Contains
元函数。关于以下标准有什么区别(如果有的话)?
A:编译时编译所需的编译时间和内存。
B:最大递归限制(允许我使用比其他参数更多的参数吗?)
C:懒惰的实例化(是否允许我忽略更多实例化?这可能不会对当前示例产生影响。但是,如果一个类嵌套了std::conditional
的typedef而不是从它派生出来吗?)
1:
template<typename T, typename... Ts>
struct Contains : std::false_type {}; //only possible if Ts is empty so does not contain
template<typename T, typename U, typename... Ts>
struct Contains<T, U, Ts...> : Contains<T, Ts...>{};
template<typename T, typename... Ts>
struct Contains<T, T, Ts...> : std::true_type{};
2:
template<typename T, typename... Ts>
struct Contains {
typedef std::false_type Type;
}; //only possible if Ts is empty so does not contain
template<typename T, typename U, typename... Ts>
struct Contains<T, U, Ts...> {
typedef typename Contains<T, Ts...>::Type Type;
};
template<typename T, typename... Ts>
struct Contains<T, T, Ts...>{
typedef std::true_type Type;
};
答案 0 :(得分:3)
我会使用继承,原因是它自然允许标签调度:
template <typename T>
void f_impl(T const & t, std::true_type derivedB) { ... }
...
template <typename T>
void f(T const & t) {
f_impl(t, is_base_of<B,T>());
}
同时,继承可用于插入嵌套信息,在本例中为::value
静态成员,其值为true
。