我正在尝试编写一个类模板,它将在构造函数参数中获取两个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);
}发布于 2017-05-19 22:31:54
HelloGoodbye是一个类模板,使用时需要指定模板参数。例如:
HelloGoodbye<void()> hgb(hi,bye); LIVE
顺便说一句:我想~HelloGoodBye()是~HelloGoodbye()的一个拼写错误。
发布于 2017-05-20 00:43:39
您可以按照松元耀的建议,显式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来定义hi和bye,但是您必须按如下方式明确说明该类型
std::function<void()> hi = std::bind(&Printer::hello, &p);
std::function<void()> bye = std::bind(&Printer::goodbye, &p);所以,我想,松元耀one是一个更好的解决方案。
https://stackoverflow.com/questions/44072619
复制相似问题