使用类型别名,我们可以引入新类型别名,例如
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)>
答案 0 :(得分:2)
A
为int(int)
。
它是一个函数类型,而不是对象类型,因此您无法向其声明类型为A
或appy sizeof
的对象(gcc会向您发出警告)。但是,您可以使用A*
这是一个普通的函数指针类型:
A* a = myfunc;
您还可以使用A
来实例化模板,例如std::function<A>
。
答案 1 :(得分:1)
using A = int(int);
介绍函数类型的别名。它是一种不完整的类型,有一些很好的用途。为了更好地说明它,让我们选择一个更好的名称,例如ButtonFunction
:
声明函数:
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; }
函数的声明现在不仅仅是一个原型,它们展示了该函数应具有的目的。
创建指向函数的指针:
ButtonFunction* f_ptr = &some_func;
指向成员的指针包括:
ButtonFunction foo::* f_ptr = &foo::mem_fun;
这允许指针语义显式而不是隐藏在别名后面。它对数据类型和函数类型都很有用。
用作模板的参数。比较std::function<ButtonFunction>
和std::function<int(int)>
。关于函子的目的哪个更清楚?