在编译时c ++计算期间,我多次遇到过这些术语。我在网上搜索过,我找到的资源是“专家级”的东西,我无法理解它。请帮助理解这些条款?我正在寻找初学者的好解释。 非常感谢您的帮助! 打包机
答案 0 :(得分:2)
C ++中的元函数是一种使用模板元编程表达编译时计算的方法 - 使用模板实例化和类型推导在编译时生成结果。
从根本上说,元函数是一个具有constexpr
成员(用于返回值的元函数)或typedef(用于返回类型的元函数)的类模板。
该函数可以通过元函数is_same
来说明,它检查两个类型参数是否相同。可能的实现(来自cppreference.com)是
template<class T, class U>
struct is_same : std::false_type {};
template<class T>
struct is_same<T, T> : std::true_type {};
其中std::true_type
是一个帮助程序元函数,其成员constexpr bool value = true
(以及false
false_type
)。
通过实例化模板并读取包含结果的成员来调用元函数,例如表达式
is_same<int,int32_t>::value
如果true
为32位,则评估为布尔值int
,否则为false
。
另一个示例,来自type_traits
std::is_floating_point
,它检查类型是否为浮点类型。它可以被称为
is_floating_point<int>::value
标准库(大多数)具有以下约定:元函数返回值具有成员value
,返回类型的元函数具有类别别名type
。
类型返回元函数的一个示例是std::iterator_traits
,它用于获取有关迭代器的信息。对于intance,给定迭代器类型Iter
,可以使用
iterator_traits<Iter>::value_type
和迭代器类别(e.i。,ForwardIterator
,RandomAccessIterator
等)
iterator_traits<Iter>::iterator_category
编译时计算的一个例子是计算阶乘的元函数:
template <unsigned int N>
struct Fac{
static constexpr unsigned int value = N * Fac<N-1>::value;
};
template <>
struct Fac<0>{
static constexpr unsigned int value = 1;
};
同样,此元函数称为Fac<5>::value
元类是C ++的一个新增功能,允许在代码中表达对(类)类的约束,而不仅仅是使用约定和文档。
例如,“接口”通常用于描述具有
的类使用元类interface
,可以编写
interface Example {
void Foo();
int Bar(int);
}
然后由编译器实例化到类
class Example {
public:
virtual void Foo() =0;
virtual int Bar(int) =0;
virtual ~Foo() =default;
}
可以在此fluentc++博文中找到有关元类提案的完整摘要。综合来源是Herb Sutter's blog post