簡體   English   中英

是否可以使函數模板從函數引用中采用`decltype`?

[英]Is it possible to make a function template take a `decltype` from a function reference?

我一直很難理解std::function模板。 似乎使用了我不知道的魔術。 它的模板參數是class R class... ARGS 但是它可以作為std::function<void>std::function<void()>傳遞到模板。 參數示例: std::function<void, int, float>std::function<void(int, float)> 是在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();
}

std::function接受一個模板參數,該參數必須是一種函數類型。 您不能使用std::function<void, int, float> std::function<void(int, float)>是唯一有效的語法。

std::function在C ++ 11中引入。 在此之前沒有std::function 但是在TR1中定義了std::tr1::function ,它使用相同的std::function<void(int, float)>語法。

您要查找的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) type現在是public成員2)它應該是函數類型,而不是為此目的的指針。 從指針類型創建非指針類型並std::remove_pointer ,但否則必須在其上使用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;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM