欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

如何让模板函数 对不同类型的参数做不同的处理

程序员文章站 2024-02-10 13:07:58
...

比如有个Convert函数,我希望对于能直接用static_cast的就不用dynamic_cast

template<typename F, typename T>

T* ConvertA(F* from)

{

//如果是std::is_convertable_v<F, T>是true就用static_cast,否则dynamic_cast

}

方案1. SFINAE和std::enable_if

template<typename F, typename T, std::enable_if_t<std::is_convertible_v<F, T>>* = nullptr>

T* ConvertB(F* from)

{

    return static_cast<T*>(from);

}

template<typename F, typename T, std::enable_if_t<!std::is_convertible_v<F, T>>* = nullptr>

T* ConvertB(F* from)

{

    return dynamic_cast<T*>(from);

}

有个坑需要注意,不能直接用

template<typename F, typename T, typename=std::enable_if_t<std::is_convertible_v<F,T>>>

原因是

A common mistake is to declare two function templates that differ only in their default template arguments. This is illegal because default template arguments are not part of function template's signature, and declaring two different function templates with the same signature is illegal.

 

方案2. if constexpr(c++17)

template<typename F, typename T>

T* ConvertA(F* from)

{

    if constexpr (std::is_convertible_v<F, T>)

    {

        return static_cast<T*>(from);

    }
}

else

{

    return dynamic_cast<T*>(from);

}

相关标签: Template C