2017-08-24 42 views
0

隨着類型別名我們可以例如引入新類型別名使用類型別名,如使用A = INT(INT)

using A = int(*)(int); 

類似於

typedef int(*A)(int); 

我找到以下碼也合法的當前C++編譯器

using A = int(int); 

我想知道A是什麼類型以及如何使用它(我沒有發現它有用m yself)

下面的代碼,它工作在GCC 6.3和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

Aint(int)的規定。

這是一個函數類型,而不是對象類型,所以你不能聲明類型爲A或appy sizeof的對象(gcc給你一個警告)。但是,您可以使用A*這是一種正常的函數指針類型:

A* a = myfunc; 

您還可以使用A實例化一個模板,e.g std::function<A>

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)>。關於函子的目的哪一個更清楚?