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

时间:2017-08-24 08:35:10

标签: c++ c++11

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

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)>

2 个答案:

答案 0 :(得分:2)

如上所述,

Aint(int)

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

A* a = myfunc;

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

答案 1 :(得分:1)

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; }
    

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

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

    ButtonFunction* f_ptr = &some_func;
    

    指向成员的指针包括:

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

    这允许指针语义显式而不是隐藏在别名后面。它对数据类型和函数类型都很有用。

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