3

これは機能します:

#include <functional>

template < bool (*F)( int ) > class Foo {};

bool fooFunc( int n ) { return true; }

int main( int argc, char* argv[] )
{
    auto a = Foo< fooFunc >();
}

ただし、ラムダを関数ポインターに変換できないため、これは機能しません。

#include <functional>

template < bool (*F)( int ) > class Foo {};

auto barFunc = [] ( int n ) -> bool { return true; };

int main( int argc, char* argv[] )
{
    auto a = Foo< barFunc >();
}

テンプレートの非型パラメーターとして std::function<> を使用できないため、これは機能しません。

#include <functional>

template < std::function< bool( int ) > F > class Bar {};

auto barFunc = [] ( int n ) -> bool { return true; };

int main( int argc, char* argv[] )
{
    auto b = Bar< barFunc >();
}

では、テンプレートの非型パラメータとしてラムダ エンクロージャを受け入れることができるテンプレート クラスを作成するにはどうすればよいでしょうか。

4

2 に答える 2

6

型パラメーターを使用してクラス テンプレートを作成し、テンプレートdecltypeをインスタンス化するときにラムダの型を推測するために使用します。

#include <functional>

template <typename Function> 
class Bar 
{ };

auto barFunc = [] ( int n ) -> bool { return true; };

int main()
{
    auto b = Bar<decltype(barFunc)>();
}


ただし、ラムダはデフォルトで構築可能ではないことに注意してください。そのためBar、ラムダのコピーを受け取るコンストラクタを作成するには、おそらくさらにコードを追加する必要があります。

template <typename Function> 
class Bar 
{ 
    public:

    Bar(Function f) : m_function(f)
    { }

    private:

    Function m_function;
};
于 2013-04-23T21:33:41.243 に答える
0

最初の例では、関数が 1 つに減衰しなかったため、ポインターを追加する必要があります。

int main( int argc, char** )
{
    auto a = Foo< std::add_pointer<decltype(fooFunc)>::type(0) >();
}
于 2013-04-23T21:43:44.910 に答える