2016-03-23 82 views
1

我想使用std :: bind和typecast函數參數與typedef函數一起使用。但是,我不能強制轉換std ::佔位符。任何想法來實現我想要做的事情?出於各種原因,我需要能夠使typedef函數具有uint16_t參數,並且還需要init函數接受一個採用uint8_t參數的成員函數)。我使用的代碼(編輯爲簡單起見):類型轉換std ::佔位符

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

您不能轉換綁定表達式('的std :: bind'結果)函數指針。看看'std :: function'。 – Simple

回答

3

這是不是可以更清潔(和更簡單的使用lambda表達式和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_; 
}; 

然後在一些其他類型的呼叫..

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); 
    }); 
    } 
};