c++如何在编译时检查模板参数类的签名
C++ how to check the signature of a template parameter class at compile time
在下面的代码中,我试图检查作为第二个模板参数传递给WTrajectory
的类的签名。在当前的实现中,WTrajectory
的构造函数比较模板实参T
的类型和作为第二个实参传递给它的模板实参的类型。
当前实现可以执行检查。但是,如果可能的话,我更愿意在编译时执行它。此外,我还想检查模板参数TWPoint
是否有一个成员函数returnTimeTypeID
,也是在编译时(在运行时执行此检查的解决方案可以在这里找到:链接)。
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");
}
};
由于returnTimeTypeID
是非虚的,编译器将在编译时知道TWPoint
的动态类型。所以不要做运行时检查只需改变你的模板:
template<typename T>
struct WTrajectory
{
typedef T TWPoint;
...
在编译时检查模板类型是否有特定方法的最佳方法是调用方法。如果它不提供所需的功能,您将得到编译错误。
如果WPoint
包含的不仅仅是类型info,那么下面的代码将工作
template<typename T>
struct WPoint
{
// ... stuff not related to type checking
};
template<typename T>
struct WTrajectory
{
WTrajectory(const WPoint<T>& wp)
{
}
};
你可以删除WPoint
,如果它不包含任何其他类型的信息。
相关文章:
- 如何检查给定的参数是否为 cv::noArray()?
- 用于检查值是否为其任何参数的帮助程序函数
- 模板化检查是否存在带有参数列表的类成员函数?
- SFINAE 检查模板参数运算符
- 检查两个模板参数是否相同
- 使用参数包自动执行dynamic_cast检查
- 检查类是否具有模板专用化(使用布尔值或 int 等模板参数)
- 为什么 std::bind 静态类型检查传递给函数的参数?
- 如何检查参数包是否具有执行顺序中的确切类型
- C++编译时检查是否可以用某种类型的参数调用重载函数
- 如何检查模板参数是否为给定值?
- 在编译时检查未实例化的类模板是否继承自其第一个模板参数
- C ++回测问题:如何检查构造函数在假定失败时是否失败(给定输入的无效参数)
- 如何在 C++ 中检查类构造函数中的参数大小
- 检查模板类型 T 是否为 C++17 中的可变参数包的一部分
- 递归回文检查,不使用向量、大小或其他参数
- 空参数检查C++
- 创建别名时静态断言模板参数检查
- 参数检查
- 通过main传递参数-检查输入是否有效