在下面的代码中,我试图检查作为第二个模板参数传递给WTrajectory
的类的签名。在当前实现中,WTrajectory
的构造函数将模板参数T
的类型与作为第二个参数传递给它的类型的模板参数进行比较。
当前实施可以执行检查。但是,如果有可能的话,我宁愿在编译时执行它。此外,我还想检查模板参数TWPoint
是否具有成员函数returnTimeTypeID
,也是在编译时(在运行时执行此检查的解决方案可以在此处找到:{{3} })。
template<typename T>
struct WPoint
{
const std::type_info& returnTimeTypeID(void) const
{return typeid(T);}
};
template<typename T, typename TWPoint>
struct WTrajectory
{
WTrajectory(const TWPoint& wp)
{
compare_types(wp);
}
void compare_types(const TWPoint& wp)
{
if (typeid(T) != wp.returnTimeTypeID())
throw std::runtime_error("Error");
}
};
答案 0 :(得分:1)
由于returnTimeTypeID
是非虚拟的,编译器将在编译时知道TWPoint
的动态类型。因此,不要进行运行时检查,只需更改模板:
template<typename T>
struct WTrajectory
{
typedef T TWPoint;
...
在编译时检查模板类型是否具有特定方法的最佳方法是只调用方法。如果它没有提供所需的功能,你将收到编译错误。
答案 1 :(得分:0)
如果WPoint
不仅包含类型信息,则以下代码将起作用
template<typename T>
struct WPoint
{
// ... stuff not related to type checking
};
template<typename T>
struct WTrajectory
{
WTrajectory(const WPoint<T>& wp)
{
}
};
如果WPoint
除了类型信息之外不包含任何其他内容,则可以将其删除。