В шаблонах, как показано ниже, я хотел бы, чтобы вызов Run(&Base::foo)
преуспеть, без необходимости дважды указывать тип Base (как это сделано при компиляции вызова Run<Base>(&Base::foo)
). Могу ли я получить это? Возможно, без добавления тонны заголовков Boost?Как вывести тип класса из типа метода в шаблонах C++?
С предоставленной кодой, я получаю ошибку:
prog.cpp:26: error: no matching function for call to ‘Run(bool (Base::*)())’
(вы можете возиться с сниппета в http://ideone.com/8NZkq):
#include <iostream>
class Base {
public:
bool foo() { return true; }
};
Base* x;
template<typename T>
struct Traits {
typedef bool (T::*BoolMethodPtr)();
};
template<typename T>
void Run(typename Traits<T>::BoolMethodPtr check) {
T* y = dynamic_cast<T*>(x);
std::cout << (y->*check)();
}
int main() {
Base y;
x = &y;
Run<Base>(&Base::foo);
Run(&Base::foo); // why error?
}
Вы знаете, компиляторы не работают автоматически, как вы хотите, чтобы они ... – ianmac45
Что с трудными вопросами на этом сегодня утром? Обычно это куча «как вы форматируете шестнадцатеричное число» или «что такое метод const». Сегодня утром мне действительно нужно думать. :) –
@ian: но делаем! – Potatoswatter