c++如何在编译时检查模板参数类的签名

C++ how to check the signature of a template parameter class at compile time

本文关键字:参数 检查 编译 c++      更新时间:2023-10-16

在下面的代码中,我试图检查作为第二个模板参数传递给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,如果它不包含任何其他类型的信息。