gpt4 book ai didi

c++ - 泛化返回基于对象和类方法的可调用函数的函数

转载 作者:太空宇宙 更新时间:2023-11-04 13:38:52 29 4
gpt4 key购买 nike

我正在尝试编写一个模板函数,该函数返回一个基于对象和类方法的可调用对象。想法是:

class Obj : public boost::enable_shared_from_this<Obj>
{
public:

bool Meth1(int a) { return a == 7; }
int Meth2(double a) { return a * 2; }
};

template<class Tobj, typename Tmeth>
auto Creator(boost::shared_ptr<TObj> shobj, Tmeth meth) -> decltype("callable based on Tmeth")
{
return boost::bind(&meth, shobj, _1);
}

用法是这样的:

boost::shared_ptr<Obj> obj = boost::make_shared<Obj>();

// mm would be of type boost::function<bool(int)>
auto mm = Creator(obj->shared_from_this(), Obj::Meth1);

bool isSeven = mm(7);

我找不到这样做的方法。有趣的是,在进行实验时,我的一次绝望尝试是这样的:

template<class Tobj, typename Tmeth>
auto return_mm(Tobj &obj, Tmeth meth)
-> decltype(boost::bind(&meth, obj.shared_from_this(), _1))
{
return boost::bind(&meth, obj.shared_from_this(), _1);
}

我知道,看起来很傻,它让 VC++10 崩溃。任何想法?也许我应该使用 boost::phoenix?

更新:

这可以在 VC++10 上编译和工作,但说真的,看起来很糟糕:

template<typename TOBJ, typename TMETH>
auto Create(boost::shared_ptr<TOBJ> sobj, TMETH mm) -> decltype( boost::bind(mm, sobj, _1) )
{
return boost::bind(mm, sobj, _1);
}

“-> decltype( boost::bind(mm, sobj, _1) )”部分对我来说不太好。此外,如果您尝试将它与需要两个参数的方法一起使用,它会破坏编译器!

最佳答案

修正了代码中的一些错误

已更新。添加了 boost::function 示例。

class Obj : public boost::enable_shared_from_this<Obj>
{
public:
bool Meth1(int a) { return a == 7; }
int Meth2(double a) { return a * 2; }
};

template<class Tobj, typename Tmeth>
auto Creator(boost::shared_ptr<Tobj> shobj, Tmeth meth)
{
return boost::bind(meth, shobj, _1);
}

template<typename Targ, class Tobj, typename Tmeth>
boost::function<bool (Targ)> Creator2(boost::shared_ptr<Tobj> shobj, Tmeth meth)
{
return boost::bind(meth, shobj, _1);
}

int main() {
boost::shared_ptr<Obj> obj = boost::make_shared<Obj>();

// mm would be of type boost::function<bool(int)>
auto mm = Creator(obj->shared_from_this(), &Obj::Meth1);
boost::function<bool (int)> mm2 = Creator2<int>(obj->shared_from_this(), &Obj::Meth1);

bool isSeven = mm(7);
cout << isSeven << endl;
cout << mm2(7) << endl;
return 0;
}

Ideone.com 上的结果

关于c++ - 泛化返回基于对象和类方法的可调用函数的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28557484/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com