Ключевое слово this
можно поставить с помощью вызываемой вами функции
class MyClass {
// ...
template<typename Type, typename Func>
void doit(Func f) {
Some::staticFunction<Type>(bind(f, this, _1));
}
};
После чего вы можете вызвать
doit<templateType>(FuncPointer);
Если хотите, вы можете наследовать функцию
// T must be a derived class of MyRegister<T>
template<typename T>
class MyRegister {
protected:
template<typename Type, typename Func>
void doit(Func f) {
Some::staticFunction<Type>(bind(f, (T*)this, _1));
}
};
class MyClass : MyRegister<MyClass> {
// ...
};
Таким образом, вы можете просто использовать doit
, а не писать сначала, как в макросе.Полезно, если у вас есть широкий диапазон классов, в которых вы используете функцию.
Редактировать: Обратите внимание, что приведение в стиле C * обязательно здесь (не можетиспользуйте static_cast
), из-за частного наследования.Это безопасное приведение, если T
получено из MyRegister<T>
Лично я предпочел бы это над макросом.Обратите внимание, что ваш макрос не может справиться с запятыми в имени типа
DO(std::pair<A, B>, g);
Это попытается передать 3 аргумента макросу вместо 2. Вы можете изменить порядок типов и функций и использоватьпеременные макросы (которые являются функцией C ++ 0x, но доступны в некоторых компиляторах в режиме C ++ 03) или вы можете использовать typedef и передать псевдоним.