#include <functional>
#include <iostream>
#include <vector>
struct MyType{
static int a;
int m_a;
MyType(){a++; m_a = a;}
void print(){
std::cout << "MyType: " << a << std::endl;
}
};
int MyType::a=0;
struct Functor{
static int a;
int m_a;
Functor(){a++; m_a = a;}
// Binding this function does not work
template<typename T>
void calculate(T * t){}
// Binding this function works!!!
void calculate2(MyType * t){
std::cout << " Functor: " << m_a <<std::endl;
t->print();
}
};
int Functor::a=0;
// Binding this function works!!!
template<typename T>
void foo( T * t){}
class ExecutionList{
public:
typedef MyType Type;
template<typename T>
void addFunctor(T * extForce){
m_calculationList.push_back( std::bind(T::calculate<Type>, extForce, std::placeholders::_1 ) );
m_calculationList.push_back( std::bind(&T::calculate2, extForce, std::placeholders::_1 ) );
m_calculationList.push_back( std::bind(&foo<Type>, std::placeholders::_1 ) );
}
void calculate(Type * t){
for(auto it = m_calculationList.begin(); it != m_calculationList.end();it++){
(*it)(t); // Apply calculation function!
}
}
private:
std::vector< std::function<void (Type *)> > m_calculationList;
};
int main(){
MyType b;
ExecutionList list;
list.addFunctor(new Functor());
list.addFunctor(new Functor());
list.calculate(&b);
}
I2luY2x1ZGUgPGZ1bmN0aW9uYWw+CiNpbmNsdWRlIDxpb3N0cmVhbT4KI2luY2x1ZGUgPHZlY3Rvcj4KCiAgICBzdHJ1Y3QgTXlUeXBlewogICAgICAgIHN0YXRpYyBpbnQgYTsKICAgICAgICBpbnQgbV9hOwogICAgICAgIE15VHlwZSgpe2ErKzsgbV9hID0gYTt9CiAgICAKICAgICAgICB2b2lkIHByaW50KCl7CiAgICAgICAgICAgIHN0ZDo6Y291dCA8PCAiTXlUeXBlOiAiIDw8IGEgPDwgc3RkOjplbmRsOwogICAgICAgIH0KICAgIH07CiAgICBpbnQgTXlUeXBlOjphPTA7CiAgICAKICAgIAogICAgc3RydWN0IEZ1bmN0b3J7CiAgICAKICAgICAgICBzdGF0aWMgaW50IGE7CiAgICAgICAgaW50IG1fYTsKICAgIAogICAgICAgIEZ1bmN0b3IoKXthKys7IG1fYSA9IGE7fQogICAgCQogICAgCS8vIEJpbmRpbmcgdGhpcyBmdW5jdGlvbiBkb2VzIG5vdCB3b3JrIAogICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CiAgICAgICAgdm9pZCBjYWxjdWxhdGUoVCAqIHQpe30KICAgICAgICAKICAgICAgICAvLyBCaW5kaW5nIHRoaXMgZnVuY3Rpb24gd29ya3MhISEKICAgICAgICB2b2lkIGNhbGN1bGF0ZTIoTXlUeXBlICogdCl7CiAgICAgICAgICAgIHN0ZDo6Y291dCA8PCAiIEZ1bmN0b3I6ICIgPDwgbV9hIDw8c3RkOjplbmRsOwogICAgICAgICAgICB0LT5wcmludCgpOwogICAgICAgIH0KICAgICAgICAKICAgIH07CiAgICAKICAgIGludCBGdW5jdG9yOjphPTA7CiAgICAKICAgIC8vIEJpbmRpbmcgdGhpcyBmdW5jdGlvbiB3b3JrcyEhIQogICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KICAgIHZvaWQgZm9vKCBUICogdCl7fQogICAgCiAgICBjbGFzcyBFeGVjdXRpb25MaXN0ewogICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgdHlwZWRlZiBNeVR5cGUgVHlwZTsKICAgIAogICAgICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgogICAgICAgICAgICB2b2lkIGFkZEZ1bmN0b3IoVCAqIGV4dEZvcmNlKXsKICAgICAgICAgICAgICAgIG1fY2FsY3VsYXRpb25MaXN0LnB1c2hfYmFjayggc3RkOjpiaW5kKFQ6OmNhbGN1bGF0ZTxUeXBlPiwgZXh0Rm9yY2UsIHN0ZDo6cGxhY2Vob2xkZXJzOjpfMSApICk7CiAgICAgICAgICAgICAgICBtX2NhbGN1bGF0aW9uTGlzdC5wdXNoX2JhY2soIHN0ZDo6YmluZCgmVDo6Y2FsY3VsYXRlMiwgZXh0Rm9yY2UsIHN0ZDo6cGxhY2Vob2xkZXJzOjpfMSApICk7CiAgICAgICAgICAgICAgICBtX2NhbGN1bGF0aW9uTGlzdC5wdXNoX2JhY2soIHN0ZDo6YmluZCgmZm9vPFR5cGU+LCBzdGQ6OnBsYWNlaG9sZGVyczo6XzEgKSApOwogICAgICAgICAgICB9CiAgICAKICAgIAogICAgICAgICAgICB2b2lkIGNhbGN1bGF0ZShUeXBlICogdCl7CiAgICAgICAgICAgICAgICBmb3IoYXV0byBpdCA9IG1fY2FsY3VsYXRpb25MaXN0LmJlZ2luKCk7IGl0ICE9IG1fY2FsY3VsYXRpb25MaXN0LmVuZCgpO2l0KyspewogICAgICAgICAgICAgICAgICAgICgqaXQpKHQpOyAvLyBBcHBseSBjYWxjdWxhdGlvbiBmdW5jdGlvbiEKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgCiAgICAgICAgcHJpdmF0ZToKICAgICAgICAgICAgc3RkOjp2ZWN0b3I8IHN0ZDo6ZnVuY3Rpb248dm9pZCAoVHlwZSAqKT4gPiBtX2NhbGN1bGF0aW9uTGlzdDsKICAgIH07CiAgICAKICAgIAogICAgCiAgICBpbnQgbWFpbigpewogICAgICAgIE15VHlwZSBiOwogICAgICAgIEV4ZWN1dGlvbkxpc3QgbGlzdDsKICAgICAgICBsaXN0LmFkZEZ1bmN0b3IobmV3IEZ1bmN0b3IoKSk7CiAgICAgICAgbGlzdC5hZGRGdW5jdG9yKG5ldyBGdW5jdG9yKCkpOwogICAgICAgIGxpc3QuY2FsY3VsYXRlKCZiKTsKICAgIH0=
prog.cpp: In member function ‘void ExecutionList::addFunctor(T*)’:
prog.cpp:48:73: error: expected primary-expression before ‘>’ token
m_calculationList.push_back( std::bind(T::calculate<Type>, extForce, std::placeholders::_1 ) );
^
prog.cpp:48:74: error: expected primary-expression before ‘,’ token
m_calculationList.push_back( std::bind(T::calculate<Type>, extForce, std::placeholders::_1 ) );
^