2013-05-11 34 views
121

我想用using寫這如何用C++ 11使用語法typedef函數指針?

typedef void (*FunctionPtr)(); 

。我會怎麼做?

+0

非常conf'using'的確,特別是因爲函數指針標識符通常駐留在'typedef'語句的中間,並使用'using'移動到前端。至少這是我迷失的地方。 – starturtle 2016-06-16 21:01:57

回答

127

它有一個類似的語法,除了你從指針刪除這些標識符:

using FunctionPtr = void (*)(); 

這裏是一個Example

如果你想「帶走uglyness」,什麼嘗試XEO建議:

#include <type_traits> 

using FunctionPtr = std::add_pointer<void()>::type; 

而這裏是另一個demo

+15

當,我希望它會帶走醜:'(' – rubenvb 2013-05-11 15:52:00

+9

@rubenvb:'使用FunctionPtr = AddPointer ;';) – Xeo 2013-05-11 15:52:31

+18

@Xeo我不完全相信這更可讀。 – Cubic 2013-05-11 17:05:14

9

你想要一個type-id,除了刪除declarator-id之外,它基本上與聲明完全相同。 declarator-id通常是一個標識符,以及您在平等聲明中聲明的名稱。

例如:

int x 

declarator-idx所以只是將其刪除:

int 

同樣:

int x[10] 

卸下x

int[10] 

對於示例:

void (*FunctionPtr)() 

這裏declarator-idFunctionPtr。所以只是將其刪除,以獲得type-id

void (*)() 

這工作,因爲給予type-id你總是可以唯一地確定該標識會去創建一個聲明。從8.1.1標準:

,能夠在[式-ID]唯一地識別該位置其中標識符似乎 如果施工是一個[宣言]。指定的類型與 假設標識符的類型相同。

7

爲了清楚起見,該語法如何?(注雙括號)

void func(); 
using FunctionPtr = decltype((func)); 
+1

這個雙括號在這個意義上是什麼意思背景? *參考*到函數指針? – 0x499602D2 2013-05-16 20:07:45

+5

你的'FunctionPtr'不是函數指針,但'decltype(&f)'是,請參見[這裏](http://coliru.stacked-crooked.com/view?id=77def487d5ed99885c0523d48c2ae7a1-50d9cfc8a1d350e7409e81e87c2653ba)。 – rubenvb 2013-05-17 07:08:12

+0

@ 1234597890 FunctionPtr是類型'void()'的非常量左值引用 – 2013-06-13 18:04:52

27

的 「醜」,如果你避開的typedef-ING的指針也可以帶走:

void f() {} 
using Function_t = void();  
Function_t* ptr = f; 
ptr(); 

http://ideone.com/e1XuYc