C++ 我更喜欢通过嵌套的typedef或继承调用模板元函数吗?
我可以编写一个递归的C++ 我更喜欢通过嵌套的typedef或继承调用模板元函数吗?,c++,templates,c++11,recursion,metaprogramming,C++,Templates,C++11,Recursion,Metaprogramming,我可以编写一个递归的Contains元函数,通过继承或嵌套的typedef调用它自己。以下标准有什么区别(如有) 答:编译时间和编译期间所需的内存 最大递归限制(一个允许我处理比另一个更多的参数吗?) C:惰性实例化(是否允许我省略更多的实例化?这在当前示例中可能没有什么区别。但是,如果一个类的嵌套typedef为std::conditionalvs,那么它是否会被派生出来?) 1: 模板 结构包含:std::false_type{}//仅当Ts为空,因此不包含 模板 结构包含:包含{}; 模板
Contains
元函数,通过继承或嵌套的typedef调用它自己。以下标准有什么区别(如有)
答:编译时间和编译期间所需的内存
最大递归限制(一个允许我处理比另一个更多的参数吗?)
C:惰性实例化(是否允许我省略更多的实例化?这在当前示例中可能没有什么区别。但是,如果一个类的嵌套typedef为std::conditional
vs,那么它是否会被派生出来?)
1:
模板
结构包含:std::false_type{}//仅当Ts为空,因此不包含
模板
结构包含:包含{};
模板
结构包含:std::true_type{};
2:
模板
结构包含{
typedef std::false_type类型;
}; //仅当Ts为空,因此不包含
模板
结构包含{
typedef typename包含::Type Type;
};
模板
结构包含{
typedef std::true_类型;
};
我会使用继承,原因是它自然允许标记分派:
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>());
}
模板
void f_impl(T const&T,std::true_type derivedB){…}
...
模板
空f(T常数和T){
f_impl(t,是()的基);
}
同时,可以使用继承插入嵌套信息,在本例中是一个
::value
静态成员,其计算结果为true
好主意,我没有想到这一点。您知道MSVC和GCC上的最大递归深度是否有差异吗?i、 e.如果我调用包含500或1000个参数的Contains,它们是否会在不同的最大值失败?@PorkyBrain:这些限制在标准中没有定义,我也不知道。但应在供应商的文件中提供。特别是对于gcc(我对gcc比VS更熟悉),您可以使用-ftemplate depth
控制它,尽管我从未使用过它。
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;
};
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>());
}