1

私はいつも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();
}
4

2 に答える 2

2

decltypeあなたが探しているものは、おそらく次のようなものです。

template<typename T>
struct transform_to_free_function;

template <typename Target, typename R, typename... Args>
struct transform_to_free_function<R (Target::*)(Args...)>
{
    using type = R(Target*, Args...);
};

注: 1)typepublicメンバーになりました。2) この目的のためのポインターではなく、むしろ関数型である必要があります。ポインター型から非ポインター型を作成するのは簡単ではありませんが、それ以外の場合は a を使用する必要がありstd::remove_pointerました。

次に、例の残りの部分は正常にコンパイルされます。

#include <functional>
using namespace std;

template<typename T>
struct transform_to_free_function;

template <typename Target, typename R, typename... Args>
struct transform_to_free_function<R (Target::*)(Args...)>
{
    using type = R(Target*, Args...);
};

struct X
{
    void x() {}
    void y(int p0) {}
    void z(int i, int p0);
};

void X::z(int i, int p0)
{
    using namespace std::placeholders;
    static function<transform_to_free_function<decltype(&X::y)>::type>
    functors[] = { bind(&X::x, _1), bind(&X::y, _1, _2) };
    functors[i](this, p0);
}

int main()
{
    X xobj;
    xobj.z(0, 1);
    xobj.z(1, 1);
    return 0;
}
于 2013-10-09T22:06:52.583 に答える