3

我可以编写一个递归Contains元函数,要么通过继承调用自身,要么通过嵌套的 typedef。以下标准有什么区别(如果有的话)?

A:编译时需要的编译时间和内存。

B:最大递归限制(一个允许我使用比另一个更多的参数吗?)

C:惰性实例化(允许我省略更多实例化吗?这在当前示例中可能没有什么不同。但是,如果一个类有嵌套的类型定义std::conditionalvs 是从它派生的?)

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;
};
4

1 回答 1

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

于 2013-11-11T14:56:12.767 回答