为什么我不能在非常量表达式上使用此模板因子函数?

时间:2017-07-28 20:06:19

标签: c++ templates

我正在尝试熟悉Template-Metaprogramming

请考虑以下代码,该代码使用基本的Factorial介绍 模板功能可以在很多模板教程中找到。

class Person(models.Model):
    dtob = models.DateTimeField(blank=False, verbose_name="Date of birth", default=datetime.now)
    dtod = models.DateTimeField(blank=False, verbose_name="Date of death", default=datetime.now)
    creationdate = models.DateTimeField(blank=False, verbose_name="Creation date", default=datetime.now)
    BLOOD_TYPE_CHOICES=(
        ('O+', 'O Positive'),
        ('O-', 'O Negative'),
        ('A+', 'A Positive'),
        ('A-', 'A Negative'),
        ('B+', 'B Positive'),
        ('B-', 'B Negative'),
        ('AB+', 'AB Positive'),
        ('AB-', 'AB Negative'),
    )
    bloodtype = models.CharField(blank=False, verbose_name="Blood type", max_length=3, choices=BLOOD_TYPE_CHOICES, default='O+')
    parentA = models.IntegerField(blank=False, verbose_name="Parent A", default=self.id)
    parentB = models.IntegerFiled(blank=False, verbose_name="Parent B", default=self.id)

如果我设置#include <iostream> template <int N> struct Factorial { static const int result = N * Factorial<N-1>::result; }; template <> struct Factorial<0> { static const int result = 1; }; int main() { int tmp; std::cin >> tmp; static const int tmpc = tmp; std::cout << Factorial<tmpc>::result << "\n"; return 0; } ,那么该示例可以正常工作,即编译时常量。但是如果tmpc = tmp那么,我得到了编译错误

tmpc=10

这是否意味着,我只能在编译时常量表达式上使用模板化函数?!!!

我的理解在哪里出错了?

2 个答案:

答案 0 :(得分:2)

  

这是否意味着,我只能在编译时使用模板化函数   常数表达式?!!!

小心术语。模板函数可以使用运行时值,但元函数不能,因为它(在定义中)在编译时被评估。

功能模板更普通:

template <typename T>
void f(T arg) { /*...*/ }

调用f()将为所使用的每个唯一类型导致不同的f()实例化,但它仍然是一个运行时函数,它采用运行时值。

使用元函数,参数本身是模板参数,模板参数不能是运行时值。

答案 1 :(得分:0)

  

我只能在编译时常量表达式上使用模板化函数吗?

是。模板在编译时进行评估。