Я хочу написать шаблонную функцию, которая проверяет некоторое свойство Timestamp (класс наследует от Timed
), но также должна работать для типов, которые не имеют отметки времени. Лучшее (и все еще довольно уродливое) решение, которое я нашел, состоит в следующем:
class Timed {
protected:
int mTime;
public:
explicit Timed(int time=0): mTime(time){}
int getT() const {return mTime;}
};
template<typename T>
bool checkStale(T const* ptr) const {
return checkStaleImp(ptr, boost::is_base_of<Timed, T>() );
}
template<typename T>
template<bool b>
bool checkStaleImp(T const* ptr, boost::integral_constant<bool, b> const &){
return true;
}
template<typename T>
bool checkStaleImp(T const* ptr, boost::true_type const&){
const int oldest = 42;
return (42 <= ptr->getT());
}
Это три функции для одной функциональности. Есть ли более простой способ сделать это, например, используйте boost::is_base_of
или что-то еще аналогично условию if или boost :: enable if для преобразования вывода функции в своего рода константу для классов, не производных от Timed
. Решения с виртуальными функциями, к сожалению, не подходят.