何を検索するのかよくわからなかったので、私は可能な限り最善の方法で説明しようとします。 STLでは、std::set
はhttp://cplusplus.comからテンプレートパラメータとしてクラスまたは関数を持つ
template <class Key, class Compare, class Allocator> class set;
のように定義される:
は比較:比較のクラス:コンテナ要素と同じタイプの2つの引数を取り、ブール値を返すクラス。式comp(a、b)はcompがこの比較クラスのオブジェクトであり、aとbがコンテナ [...]の要素です。これは、関数呼び出し演算子を実装するクラスまたは関数へのポインタ [...]のいずれかです。
私はCompare
テンプレートパラメータについて話しています。
私は関数呼び出し演算子を実装するクラスであるテンプレートパラメータを持つテンプレートクラスを記述した場合、私はそれを書くことだったのであれば、私は、
template <class T, class Combine>
class MyClass
{
public:
Combine func;
MyClass()
{
func = Combine();
}
T do_it(T a, T b)
{
return func(a, b);
}
};
class IntCombine
{
public:
int operator() (int a, int b)
{
return a + b;
}
};
//...
MyClass<int, IntCombine> ob;
ob.do_it(4, 5);
を書いたりしたいです2番目のテンプレートパラメータは関数です:
template <class T, T Combine(T, T)>
class MyClass
{
public:
Combine func;
MyClass()
{
func = Combine;
}
T do_it(T a, T b)
{
return func(a, b);
}
};
int IntCombine(int a, int b)
{
return a + b;
}
//...
MyClass<int, IntCombine> ob;
ob.do_it(4, 5);
ただし、STLでは、どちらの方法でもsetクラスを使用できます。これはどうやって実現されますか?上記のコードは、ob
の定義の2番目のテンプレートパラメータがそれぞれoperator()
を実装するクラスか関数のいずれかである場合にのみ機能しますが、両方とも動作するようにMyClass
を書くことはできません。
私の例はかなり役に立たないようです。基本的には、要素を組み合わせることができるコンテナを作成する必要があります。これはSTLコンテナと同じように一般的です。
実際にテンプレートで関数ポインタを渡すことも可能です。 – Puppy
@DeadMG:正しいですが、テンプレートパラメータに(* pointer *ではなく)関数を渡す場合と同様に、これは上記のシグネチャでは機能しません。つまり、 'typename'の代わりに関数ポインタテンプレート引数リストに入力します。 –
テンプレート 'を実行するのは完全に合法です。 –
Puppy