私はいつもstd::function
テンプレートを理解するのに苦労しました。まだ知らない魔法を使っているようだ。テンプレートの引数はclass R
,class... ARGS
です。std::function<void>
ただし、またはとしてテンプレートに渡すことができますstd::function<void()>
。パラメータを使用した例:std::function<void, int, float>
またはstd::function<void(int, float)>
. この 2 番目の構文はc++11で導入されましたか? これは以前は有効ではなかったと思います。
また、関数の を取得decltype
して関数テンプレートに渡す方法はありますか? 関数テンプレートのセットアップが非常に簡単になります。
次に例を示します。
#include <functional>
using namespace std;
///////////////////////////////////////////////////////////////////////////////
// this works
void x() {}
void y(int p0) {}
int main1()
{
using namespace std::placeholders;
function<decltype(y)> functors[] = { bind(x), bind(y, _1) };
functors[0](1);
functors[1](1);
return 0;
}
///////////////////////////////////////////////////////////////////////////////
// this doesn't work
struct X
{
void x() {}
void y(int p0) {}
void z(int i, int p0)
{
using namespace std::placeholders;
static function<decltype(&X::y)> functors[] = { bind(&X::x, _1), bind(&X::y, _1, _2) };
functors[i](this, p0);
}
};
int main2()
{
X xobj;
xobj.z(0, 1);
xobj.z(1, 1);
return 0;
}
int main()
{
return main1() + main2();
}