简体   繁体   中英

Using std::bind on template class member

Consider the code below

#include <iostream>
#include <functional>
class Solver{
public:
    int i = 0;
    void print(){
        std::cout << "i solved" << std::endl;
    }
};

template <typename T> class ThingHandler{
public:
    template <typename B,typename C>
    void handleThing(T& solver,B paramOne,C paramTwo){
        std::cout << "i handled something " << std::endl;
        solver.print();
        std::cout << paramOne << paramTwo;
    }
};

class CantHandle{
public:
    void needHelp(std::function<void(int,int)> handleThing){
        int neededInt = 0;
        int neededIntTwo = 2;
        handleThing(neededInt,neededInt);
    }
};


int main() {
    ThingHandler<Solver> thingHandler;
    CantHandle cantHandle;
    Solver solver;
    solver.i = 10;

    auto fp = std::bind(&ThingHandler<Solver>::handleThing<Solver,int,int>, 
    thingHandler,solver,std::placeholders::_1,std::placeholders::_1);
    //the row above is what I want to achieve
    cantHandle.needHelp(fp);
    return 0;
}

I'm getting the following error:

140: error: no matching function for call to 'bind(, ThingHandler&, Solver&, const std::_Placeholder<1>&, const std::_Placeholder<1>&)' 37 | auto fp = std::bind(&ThingHandler::handleThing, thingHandler,solver,std::placeholders::_1,std::placeholders::_1);

What I want to do is have a generic class that solves some problem. Then call upon a specialization of that class. So in the case above I want ThingHandler to be (Solver& solver, int paramOne, int paramTwo). I'm not quite sure how to achieve this.

Member function you bind takes two template type parameters, so Solver is redundant in template argument list.

Should be:

&ThingHandler<Solver>::handleThing<int,int>

Some remarks: your code binds handleThing for a copy of thingHandler instance.

Also first bound parameter - solver , is copied into functor generated by bind . If you want to avoid these two copies, use & or std::ref :

auto fp = std::bind(&ThingHandler<Solver>::handleThing<int,int>, 
    &thingHandler,std::ref(solver),std::placeholders::_1,std::placeholders::_2);

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM