首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >调用std::functions

调用std::functions
EN

Stack Overflow用户
提问于 2017-05-19 22:28:23
回答 2查看 1.7K关注 0票数 3

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

我遗漏了什么?

代码语言:javascript
复制
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);      
}
EN

回答 2

Stack Overflow用户

发布于 2017-05-19 22:31:54

HelloGoodbye是一个类模板,使用时需要指定模板参数。例如:

代码语言:javascript
复制
HelloGoodbye<void()> hgb(hi,bye);   

LIVE

顺便说一句:我想~HelloGoodBye()~HelloGoodbye()的一个拼写错误。

票数 3
EN

Stack Overflow用户

发布于 2017-05-20 00:43:39

您可以按照松元耀的建议,显式hgb的模板类型,也可以创建一个make函数

代码语言:javascript
复制
template <typename T>
HelloGoodbye<T> makeHG (std::function<T> const & hi,
                        std::function<T> const & bye)
 { return { hi, bye }; }

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

代码语言:javascript
复制
auto hgb = makeHG(hi, bye);

不幸的是,std::bind是一个返回值未定义的怪兽,因此您不能将从std::bind返回的类型传递给makeHG()以获得T类型推导。

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

代码语言:javascript
复制
  std::function<void()> hi = std::bind(&Printer::hello, &p);
  std::function<void()> bye = std::bind(&Printer::goodbye, &p);

所以,我想,松元耀one是一个更好的解决方案。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44072619

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档