関数をテンプレートにして、 を返す任意の呼び出し可能なオブジェクトを受け入れることができますbool
。例えば:
template<typename P>
void doSomething(P&& p)
{
while (p())
{
something();
}
}
たとえば、次のようにラムダを渡して呼び出すことができます。
int main()
{
// Possibly pass a more clever lambda here...
doSomething([] () { return true; });
}
もちろん、ラムダの代わりに通常のファンクターを渡すこともできます。
struct my_functor
{
// Possibly write a more clever call operator here...
bool operator () ()
{
return true;
}
};
int main()
{
doSomething(my_functor());
}
関数ポインターもオプションです。
// Possibly use a more clever function than this one...
bool my_predicate()
{
return true;
}
int main()
{
doSomething(my_predicate);
}
関数をテンプレートにしない理由がある場合 (たとえば、virtual
あるクラスのメンバー関数であるため)、次を使用できますstd::function
。
void doSomething(std::function<bool()> p)
{
while (p())
{
something();
}
}
上記のすべての例は で同様にうまく機能しますがstd::function
、実行時のオーバーヘッドがいくらか発生することは確かです(ただし、ユース ケースには無関係かもしれません)。