【发布时间】:2012-02-07 16:28:54
【问题描述】:
我想编写一个模板函数来检查一些 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 的类的一种常量。遗憾的是,具有虚拟功能的解决方案不是一种选择。
【问题讨论】:
-
@AJG85:实际函数是类模板的成员(省略以缩短示例)所以模板与否的问题已经过时,但阅读 fernandes 的答案我认为一个更简单的解决方案是可能
-
这就是评论的重点。让您考虑诸如重载等替代方案。
标签: c++ templates boost sfinae