编程语言中元功能和元类的含义是什么?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了编程语言中元功能和元类的含义是什么?相关的知识,希望对你有一定的参考价值。

在编译时c ++计算期间,我多次遇到过这些术语。我在网上搜索过,我找到的资源是“专家级”的东西,我无法理解它。请帮助理解这些条款?我正在寻找初学者的好解释。非常感谢您的帮助!打包机

答案

元函数

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(和falsefalse_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.,ForwardIteratorRandomAccessIterator等)

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

元类

Metaclasses是C ++的一个新增功能,允许在代码中表达对(类)类的约束,而不仅仅是使用约定和文档。

例如,“接口”通常用于描述具有的类

  1. 只有纯虚拟公共功能
  2. 到虚拟析构函数

有一个元类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

以上是关于编程语言中元功能和元类的含义是什么?的主要内容,如果未能解决你的问题,请参考以下文章

Grails - 使方法全局可用和元类编程

谈谈Python中元类Metaclass:什么是元类

自定义元类和元类的用途

类和元类

Python基础入门自学——12--new方法和元类

参数化类和元类有啥区别(请使用 Python 中的代码示例)?