テンプレートパラメータにはポインタを指定することができる(cppll:10249 参照)
#include <iostream> using namespace std; template <int* Pointer> void foo() { if (Pointer) cout << *Pointer << endl; else cout << "null" << endl; } int value = 3; int main() { foo<&value>(); return 0; }
参照も指定できる
#include <iostream> using namespace std; template <int& Ref> void foo() { ++Ref; } int value = 3; int main() { foo<value>(); cout << value << endl; // 4 return 0; }
関数ポインタも指定できる(サンプルは書かないがメンバ関数ポインタもできる)
#include <iostream> using namespace std; int add(int x) { return x + 1; } template <int Func(int)> // 関数を受け取るテンプレート void invoke(int x) { cout << Func(x) << endl; } int main() { invoke<&add>(3); // 4 return 0; }
これはコンパイル時に関数を切りかえる必要があるときに使う
テンプレートパラメータにメンバ関数ポインタを指定する例は以下
N1615 C++ Properties -- a Library Solution
「Template Parameter Pointer」で検索するとサンプルがけっこう見つかる