2013-10-27 24 views
7

のテンプレート呼び出し、私はその後、C++関数ポインタ型

execute<task>(); 

がコンパイルされます

typedef void (*command)(); 

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

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

のような型宣言を持っているし、期待通りに動作している場合。しかし、私がテンプレートを

として定義した場合、
template <command c> 
void execute() { 
    command(); 
} 

まだコンパイルされます。私は偶然これをしました。今、私は第2版が何をすると思われるのか混乱しています。

+2

'command();'は、typedefによって定義された関数* pointer * typeの一時オブジェクトを作成します。 – Nawaz

+2

'execute(command)';の呼び出しに何か間違っていますか?なぜこのようなハイブリッドパターンを使いたいのですか? –

+0

これは削除された例です。私が実際にしたことはここにあります:http://stackoverflow.com/a/19611077/2036917ポイントは、テンプレートを使用すると、静的変数の異なるインスタンスを持つことができます。私は適切なオブジェクトで同じことを達成できることを知っています。しかし、Arduinoにはわずか2KのRAMしかないことを再度覚えておいてください。だから、アプローチは少しメモリフットプリントを減らします。 –

答えて

8

type_nameのデフォルト初期化インスタンスを作成する式です。

原住民のタイプについては、暗黙的に定義されたデフォルトコンストラクタがあり、例えばので

int(); 

は、有効なC++の文(ちょうどintを作成し、それを捨てる)です。

g++警告が完全に表示されていると、疑わしい(意図しない)操作であるため診断メッセージが表示されますが、コードは有効であり、プログラムが依存することもあります(ユーザー定義型とコンストラクタインスタンスの副作用があります)。

+1

それは正しいと思います:コマンドのtemp = command();を書くことはまた、値0をコンパイルして値 'temp'に割り当てます。 – memo1288

+1

@ memo1288:はい...そしてネイティブタイプの場合は、 'command temp;'とは異なります音があまりにも右) – 6502

4
command(); 

それはTYPE();のような一時的なオブジェクトを作成し、コンパイラが未使用変数としてそれを省略します。

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

-Wallコンパイラのオプションを有効にする必要があります。 C++

type_name() 

Live code.