我正在尝试熟悉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
这是否意味着,我只能在编译时常量表达式上使用模板化函数?!!!
我的理解在哪里出错了?
答案 0 :(得分:2)
这是否意味着,我只能在编译时使用模板化函数 常数表达式?!!!
小心术语。模板函数可以使用运行时值,但元函数不能,因为它(在定义中)在编译时被评估。
功能模板更普通:
template <typename T>
void f(T arg) { /*...*/ }
调用f()将为所使用的每个唯一类型导致不同的f()实例化,但它仍然是一个运行时函数,它采用运行时值。
使用元函数,参数本身是模板参数,模板参数不能是运行时值。
答案 1 :(得分:0)
我只能在编译时常量表达式上使用模板化函数吗?
是。模板在编译时进行评估。