テンプレートパラメータに指定できるもの

テンプレートパラメータにはポインタを指定することができる(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」で検索するとサンプルがけっこう見つかる