以下に示すテンプレートでは、(コンパイル呼び出しRun(&Base::foo)
で行われるように) Base タイプに 2 回名前を付ける必要なく、呼び出しが成功することを望みます。Run<Base>(&Base::foo)
それもらっていいですか?おそらく、大量のBoostヘッダーを追加せずに?
提供されたコードでは、次のエラーが発生します。
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?
}