2016-03-23 6 views
1

Ich versuche std :: bind und typecast die Funktionsargumente für eine typedef Funktion verwenden. Ich kann jedoch den Std :: Platzhalter nicht eingeben. Irgendwelche Ideen, um zu implementieren, was ich versuche zu tun? Aus verschiedenen Gründen muss ich in der Lage sein, die typedef-Funktion ein uint16_t-Argument zu haben, und auch die init-Funktion akzeptiert eine Member-Funktion, die ein uint8_t-Argument annimmt. Der Code (der Einfachheit halber bearbeitet), die ich verwende:Typ cast std :: Platzhalter

typedef void (write_func_t) (uint16_t, uint8_t); 

class MyClass { 
public: 
    MyClass(); 


    template < typename T > 
    void init(void (T::*write_func)(uint8_t, uint8_t), T *instance)  { 
    using namespace std::placeholders; 
    _write_func = std::bind(write_func, instance, (uint16_t)_1, _2); 
    this->init(); 
    } 

private: 
    write_func_t *_write_func; 

}; 
+1

Sie können keine bind Ausdruck ('std :: bind' Ergebnis) auf einen Funktionszeiger umwandeln. Schau dir 'std :: function' an. – Simple

Antwort

3

Wäre dies sauberer nicht (und viel einfacher mit Lambda-Ausdrücke und std::function<>)?

class MyClass { 
    using WriteFunc = std::function<void(int16_t, int8_t)>; 

public: 

    void init(WriteFunc&& func) { 
    write_func_ = std::move(func); 
    } 

private: 
    WriteFunc write_func_; 
}; 

Dann in einer anderen Art nennen ..

class Foo { 
    // e.g 
    void SomeWriteFunction(int8_t x, int8_t y) { 
    } 

    void bar() { 
    // The lambda wraps the real write function and the type conversion 
    mc_inst.init([this](int16_t x, int8_t y) { 
     this->SomeWriteFunction(x, y); 
    }); 
    } 
}; 
Verwandte Themen