使用创建方法

时间:2018-03-06 23:42:12

标签: c++ templates

我想在类中创建一个静态方法,它基本上只为我创建组件,我想为不同的类重载此方法,但我无法让它工作。这是我到目前为止所提出的最好的方法:

    template <typename T, typename... Args>
    static T* _Create(Args&&... args) 
    {
        T* component = new T(std::forward<Args>(args)...);
        return component;
    }

    template <typename T, typename... Args, typename std::enable_if<std::is_same<Camera, T>::value>::type* = nullptr>
    static T* _Create(Args&&... args) 
    {
        T* component = new T(std::forward<Args>(args)...);
        // Do stuff with the component e.g. add it to a list
        return component;
    }

    template <typename T, typename... Args, typename std::enable_if<std::is_base_of<CRenderer, T>::value>::type* = nullptr>
    static T* _Create(Args&&... args) 
    {
        T* component = new T(std::forward<Args>(args)...);
        // Do stuff with the component e.g. add it to a list
        return component;
    }

但当然这不起作用,因为_Create与“Camera”确实匹配第一和第二个功能。有人可以请我朝正确的方向努力吗?我怎样才能做到这一点?

1 个答案:

答案 0 :(得分:2)

由于您可以访问C ++ 17(并且已经表现出犹豫不决以添加更多enable_if)...

您可以使用if constexpr将所有功能合并为一个!

template <typename T, typename... Args>
static T* _Create(Args&&... args) 
{
    T* component = new T(std::forward<Args>(args)...);

    if constexpr( std::is_same<Camera, T>::value )
    {
        // Do stuff with the component e.g. add it to a list
    }

    if constexpr( std::is_base_of<CRenderer, T>::value )
    {
        // Do stuff with the component e.g. add it to a list
    }

    return component;
}

这将生成与您编写的代码一样高效的代码。