繁体   English   中英

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

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

在下面的代码中,我试图检查作为第二个模板参数传递给WTrajectory的类的签名。 在当前实现中, WTrajectory的构造WTrajectory比较模板参数T的类型和作为第二个参数传递给它的类型的模板参数。

当前实现可以执行检查。 但是,如果可能的话,我宁愿在编译时执行它。 此外,我还想检查模板参数TWPoint是否具有成员函数returnTimeTypeID ,也可以在编译时进行检查(可以在运行时执行此检查的解决方案,可在这里找到: link )。

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包含类型信息,那么以下代码将起作用

template<typename T>
struct WPoint
{
    // ... stuff not related to type checking
};

template<typename T>
struct WTrajectory
{
    WTrajectory(const WPoint<T>& wp)
        {
        }
};

如果WPoint除了类型信息以外不包含其他任何内容,则可以删除。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM