Отправка во время компиляции через boost :: is_base_of и частичную специализацию шаблона класса:
template<class T, class _>
struct CookDetail {
static void cook(T& obj) {
cout << "uncookable\n";
}
};
template<class T>
struct CookDetail<T, boost::true_type> {
static void cook(ICookable& obj) {
obj.CookMe();
}
};
template<class T>
void cook(T& obj) {
return CookDetail<T, boost::is_base_of<ICookable, T> >::cook(obj);
}
Тем не менее, наличие «работы» cook (non_icookable_obj) для меня является ошибкой. Я бы предпочел ошибку времени компиляции для попытки приготовить неприготовленное.
Обратите внимание, что то, что вы пробовали, терпит неудачу, потому что именно так работает разрешение функций. Точное совпадение по шаблону (cook (Egg &)) считается лучше, чем шаблон, требующий преобразования (cook (ICookable &)). Подробности в FCD , если вы хотите загадочные технические детали.