Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 我更喜欢通过嵌套的typedef或继承调用模板元函数吗?_C++_Templates_C++11_Recursion_Metaprogramming - Fatal编程技术网

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>());
}