使用std :: function作为C 11中的委托

前端之家收集整理的这篇文章主要介绍了使用std :: function作为C 11中的委托前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
假设我有这三种不同的功能,我可能想指出:
float test1(int a,int b) {
    return 7.0f;
}

struct TestClass {
    float test2(int a,int b) {
        return 5.0f;
    }
};

struct TestClass2 {
    float  test3(int a,int b) {
        return 3.0f;
    }
};

注意所有三个都使用相同的参数并返回值.我想抽象它是否是一个成员函数和它属于哪个类.我想要一个委托类型,它可以引用这三个函数中的任何一个,这取决于它是如何初始化的.

这是我的第一次尝试:

typedef std::function<float(int,int)> MyDelegate; // is this right?

int main() {
    TestClass obj; 
    TestClass2 obj2;

    MyDelegate a = test1;
    MyDelegate b = std::bind(std::mem_fn(&TestClass::test2),obj); // is this right?
    MyDelegate c = std::bind(std::mem_fn(&TestClass2::test3),obj2); // is this right?

    return 0;
}

我的想法是我也想在包装器中存储’this’指针.这样,它就像一个功能齐全的委托.例如,调用’b(x,y)’应该像调用obj.test2(x,y).

我甚至无法编译它,我可能还没有完全掌握它.我对这些库有点新意,VS2012中的错误是灾难性的无益的.任何帮助,将不胜感激.

解决方法

你需要告诉std :: bind如何处理其他函数参数.为了使调用b(x,y)将x和y委托给两个原始函数参数,您需要使用std :: placeholders命名空间中的占位符:
std::bind(&TestClass::test2,obj,std::placeholders::_1,std::placeholders::_2);

而且也不需要std :: mem_fn(虽然它可以工作),因为std :: bind已经正确处理成员函数(使隐式this参数成为显式的第一个参数,就像std :: mem_fn那样).

原文链接:https://www.f2er.com/c/119510.html

猜你在找的C&C++相关文章