gpt4 book ai didi

c++ - 用于创建方法的可变参数模板的模板特化

转载 作者:行者123 更新时间:2023-11-28 01:36:13 24 4
gpt4 key购买 nike

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

    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 with "Camera"确实匹配第一个和第二个函数。有人可以把我推向正确的方向吗?我怎样才能做到这一点?

最佳答案

由于您可以访问 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;
}

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

关于c++ - 用于创建方法的可变参数模板的模板特化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49141857/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com