Здравствуйте, CEMb, Вы писали:
CEM>Проблема определения на момент компиляции наличия у класса метода с нужной сигнатурой решается, например, шаблонами.
...
CEM> CT<CGood> cg(1); // OK
CEM> CT<CBad> cb(1); // Error
CEM>[/ccode]
А теперь осталось это ОК/Еггог запихать в сфинью, чтобы получить HasMethod::value, и вся эта хренота вместо одной строки, которую уже десять лет просят добавить в язык.
Нагугленная же реализация примерно такая:
template <typename T>
class HasSomeMethod
{
typedef char y;
typedef y n[2];
template <typename U, U> struct ReallyHas;
template <typename C> static y& Test(ReallyHas <Result (C::*)(Args), &C::Method>*);
template <typename> static n& Test(...);
public:
static bool const value = sizeof(Test<T>(0)) == sizeof(y);
};
Я до сих пор не понимаю, почему это надо делать именно так. Но когда я пробовал по-своему, по-другому, то у меня не получалось.
Нет такой подлости и мерзости, на которую бы не пошёл gcc ради бессмысленных 5% скорости в никому не нужном синтетическом тесте