使用类型别名,例如使用 A = int(int)

using type alias such as using A = int(int)

本文关键字:int 类型 别名      更新时间:2023-10-16

例如,使用类型别名,我们可以引入新的类型别名

using A = int(*)(int);

类似于

typedef int(*A)(int);

我发现以下代码对于当前的C++编译器也是合法

using A = int(int);

我想知道 A 的类型是什么以及如何使用它(我自己觉得它没有用(

这是代码,它适用于 gcc 6.3 和 clang 4.0

#include <iostream>
#include <functional>
#include <typeinfo>
#include <cxxabi.h>
using namespace std;
using A = int(int);
using B = int(*)(int);
int main(){
int status;
cout<<sizeof(A)<<endl; //Error in clang 4.0
cout<<sizeof(B)<<endl;
cout<<sizeof(function<int(int)>)<<endl;
cout<<typeid(A).name()<<endl;
cout<<typeid(B).name()<<endl;
cout<<typeid(function<int(int)>).name()<<endl;
cout<<abi::__cxa_demangle(typeid(A).name(), 0, 0, &status)<<endl;
cout<<abi::__cxa_demangle(typeid(B).name(), 0, 0, &status)<<endl;
cout<<abi::__cxa_demangle(typeid(function<int(int)>).name(), 0, 0, &status)<<endl;
return 0;
}

输出为

1
4
16
FiiE
PFiiE
St8functionIFiiEE
int (int)
int (*)(int)
std::function<int (int)>

A如前所述int(int)

它是一个函数类型,而不是对象类型,因此您不能为其声明类型A或 appysizeof的对象(gcc 会向您发出警告(。但是,您可以使用A*,这是一种普通的函数指针类型:

A* a = myfunc;

您还可以使用A实例化模板,例如std::function<A>.

using A = int(int);引入函数类型的别名。这是一个不完整的类型,有一些很好的用途。为了更好地说明它,让我们选择一个更好的名称,例如ButtonFunction

  1. 声明函数:

    ButtonFunction some_func;
    int main() {
    return some_func(0);
    }
    int some_func(int) { // *Definitions* must be with the prototype 
    return 0;
    } 
    

偶数成员函数:

class foo {
ButtonFunction mem_fun;
};
int foo::mem_fun(int) { return 0; }

函数的声明现在不仅仅是一个原型,它们展示了函数应该具有的目的。

  1. 创建指向函数的指针:

    ButtonFunction* f_ptr = &some_func;
    

指向成员的指针包括:

ButtonFunction foo::* f_ptr = &foo::mem_fun;

这允许指针语义是显式的,而不是隐藏在别名后面。它适用于数据类型和函数类型。

  1. 用作模板的参数。比较std::function<ButtonFunction>std::function<int(int)>.哪一个更清楚函子的目的?