调用std :: functions

时间:2017-05-19 14:28:23

标签: c++ c++11 templates

我正在尝试编写一个类模板,它将在构造函数参数中获得两个std::function,并在构造和销毁时以RAII样式调用它们。

我错过了什么?

template <class T>
class HelloGoodbye{
public:
HelloGoodbye(std::function<T> const & f, std::function<T> const &g)
  :mf(f),mg(g)
{
  mf();
}


~HelloGoodBye()
{
  mg();
}

private:
std::function<T> mf;
std::function<T> mg;
};


class Printer
{
    public:
    void hello()
    {
        std::cout << "hello!" << std::endl;
    }
    void goodbye()
    {
        std::cout << "Goodbye!" << std::endl;   
    }
};

int main()
{
      Printer p;
      auto hi = std::bind(&Printer::hello, &p);
      auto bye = std::bind(&Printer::goodbye, &p);
      HelloGoodbye hgb(hi,bye);      
}

2 个答案:

答案 0 :(得分:3)

HelloGoodbye是一个类模板,您需要在使用时指定模板参数。 e.g。

HelloGoodbye<void()> hgb(hi,bye);   

LIVE

BTW:我认为~HelloGoodBye()~HelloGoodbye()的拼写错误。

答案 1 :(得分:0)

您可以按照songyuanyao的建议明确hgb的模板类型,也可以创建一个make函数

template <typename T>
HelloGoodbye<T> makeHG (std::function<T> const & hi,
                        std::function<T> const & bye)
 { return { hi, bye }; }

并使用auto,您可以按如下方式初始化hgb

auto hgb = makeHG(hi, bye);

不幸的是,std::bind是一个奇怪的野兽,其返回值未定义,因此您无法将从std::bind返回的类型传递给makeHG()以获取T类型演绎。

因此,如果您想使用makeHG(),可以使用auto来定义hibye,但必须按以下方式说明类型

  std::function<void()> hi = std::bind(&Printer::hello, &p);
  std::function<void()> bye = std::bind(&Printer::goodbye, &p);

所以,我想,sonyuanyao是一个更好的解决方案。