2013-10-27 230 views
7

的模板調用如果我有類型聲明一樣C++函數指針類型

typedef void (*command)(); 

template <command c> 
void execute() { 
    c(); 
} 

void task() { /* some piece of code */ } 

然後

execute<task>(); 

編譯和行爲與預期相同。但是,如果我將模板定義爲

template <command c> 
void execute() { 
    command(); 
} 

它仍然編譯。我意外地做了這件事。現在我對第二版預計會做什麼感到困惑。

+2

'command();'創建'typedef'定義的函數*指針*類型的臨時對象。 – Nawaz

+2

調用'execute(command)';?有問題嗎?爲什麼你想要使用這種混合模式? –

+0

這是一個精簡的例子。我真正做的是在這裏:http://stackoverflow.com/a/19611077/2036917關鍵是,該模板允許我有不同的靜態變量的實例。我知道我可以用適當的物體來達到同樣的效果。但是,再次記住一個Arduino只有2K的RAM。因此,這種方法稍微減少了內存佔用。 –

回答

8

在C++

type_name() 

是創建的type_name缺省初始化實例的表達式。

對於當地人類型有隱式定義的默認構造,因此,例如

int(); 

是一個有效的C++聲明(只是創建一個int並拋出它扔掉)。

g++因爲它是一個可疑(可能是非預期的)操作,所以會發出診斷消息,但代碼是有效的,甚至可以有依賴它的程序(如果該類型是用戶定義的類型和構造函數的實例有副作用)。

+1

這聽起來是正確的:寫命令temp = command();'也編譯並賦值給'temp'的值0 – memo1288

+1

@ memo1288:是的......對於本機類型,它與'command temp;'不同「聽起來太對了) – 6502

4
command(); 

它創建像TYPE();臨時對象和編譯器忽略它作爲一個未使用的可變

warning: statement has no effect [-Wunused-value] 
    command(); 
    ^

您應該打開-Wall編譯器的選項。 Live code.