在编译时获取std :: bind的类型

时间:2018-01-05 19:05:10

标签: c++ c++11 bind

如何获取std::bind表达式的类型以将其存储在类成员中?例如,我有这个:

template<class F, class ...Args>
void foo(F&& funct, Args&&... args) {
  typedef decltype(std::bind(funct, std::forward<Args>(args)...)) T;
  T bar = std::bind(funct, std::forward<Args>(args)...);
}

但我想将其转换为:

template<class F, class ...Args>
class Foo {
  void foo(F&& funct, Args&&... args) {
    bar = std::bind(funct, std::forward<Args>(args)...);
  }
  T bar;  // what is the type of bar?
}

2 个答案:

答案 0 :(得分:5)

std::declval()是你的朋友。

类型是

decltype(std::bind(std::declval<F&>(), std::declval<Args>()...))

答案 1 :(得分:1)

std::function似乎更简单。但你可以使用:

template<class F, class ...Args>
class Foo {
    using T = decltype(std::bind(std::declval<F>(), std::declval<Args>()...));

  Foo(F&& funct, Args&&... args) : bar(std::bind(funct, std::forward<Args>(args)...))
  {}
  T bar;
};

请注意,std::bind返回类型不能默认构造。