版本类型的模板参数

时间:2014-08-13 08:01:51

标签: c++ templates

因此有3种类型的模板参数:

type
non-type
template

因此,如果使用模板作为"类"对于类...换句话说,模板是一个类,一个类是一个对象...并提供诸如数据类型独立性之类的东西,为什么我要使用类型参数模板?  例如,为什么我会想要使用像

这样的东西
template <int n = 1>

谢谢

4 个答案:

答案 0 :(得分:2)

有很多用途,C ++模板不仅仅是“逃避​​类型”的意思。

  • std::array<T, N>就是一个例子:在编译时捕获数组大小

  • 标准库中的许多示例:请参阅std::get<>以访问tuple元素

  • Integrals参数可以作为MTP算法的输入(因此,允许C ++模板形成一个完整的图灵机,这是该语言的主要属性):

Example of a compile-time factorial :

template <int n>
struct factorial {
    enum { value = n * factorial<n - 1>::value };
};

template <>
struct factorial<0> {
    enum { value = 1 };
};

答案 1 :(得分:1)

据我了解你的问题,你的关系如下:

(meta-template)->template->class->object

元模板是可以作为一种模板生成器的模板。这不是真的,但也不是模板是类生成器的事实。

模板can可用作类生成器。这通常导致二进制文件中相同代码的多个副本,有时并不是真正有用的。

但是模板可以做得更多!

模板允许在编译期间进行计算。它们可能没有生成代码,它们不会导致任何类,也不会导致实例。在编译期间评估完整的代码并产生新类型,这些类型本身可以用作其他模板的特征,或者它们可以计算可以在代码中用作正常值的常量。所有这些都没有任何模板 - &gt; class-&gt;对象关系。

这是有时使用整数值的地方。它们可用于进行编译时计算。此值也可用作选择专业化的特征。

因此,您的规则只是c ++模板世界的一个方面。而且在这个小世界中,可以使用整数来创建具有此int参数的类,例如固定大小的数组等。例如,参见std :: array,其中size的int值是模板参数。

模板中int参数的另一个用例是遍历类型的递归模板。在这种情况下,通常可以使用count int参数。也许这将在编译时像switch一样进行评估,并且编译时的计数器类似于运行时世界中的enum

希望这有帮助。

答案 2 :(得分:0)

你的问题令人困惑。你声称要问:

  

为什么我要使用类型参数模板?

但是,您的示例是使用非类型模板参数的示例。

当值有问题必须是编译时常量时,您需要/需要使用非类型模板参数(如您的示例中所示)。

例如,std::array的第二个模板参数会影响其大小,该大小必须是编译时常量,因此只能受编译时常量的影响。因此,您无法在运行时指定此项,因此必须在编译时通过模板参数指定它。

答案 3 :(得分:0)

你可以在这里看到一个例子: https://android.googlesource.com/platform/art/+/master/compiler/utils/arena_allocator.h

ArenaAllocatorStatsImpl被定义为(第63行): 模板类ArenaAllocatorStatsImpl; 其中kCount意味着你想要分配,如果它是真的。

然后你有一个版本的实现(第66行),它不计算分配 模板&lt;&gt; Arena ArenaAllocatorStatsImpl类

在第82行中有一个通用实现,但它仅用于kCount为true的情况,因为第66行的实现涵盖了false。

这允许您拥有两个版本的代码。一个用于调试和开发,另一个用于生产。模板在编译时解析,因此您不需要生产开销。