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

时间:2015-05-19 18:24:30

标签: c++ templates c++11 sfinae

在下面的代码中,我试图检查作为第二个模板参数传递给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");
        }
};

2 个答案:

答案 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除了类型信息之外不包含任何其他内容,则可以将其删除。