具有变化的返回类型的可变参数模板参数列表

安德烈·费雷拉

我正在尝试使用返回类型不断变化的模板化可变参数。如果参数个数为1,则应返回指向唯一参数的指针,否则应返回该参数的指针元组:

int var = 0;
A *ptr_A = foo<A>(var);
auto *[ptr_A, ptr_B] = foo<A, B>(var);

这是我到目前为止的代码

template<typename T>
T* AddComp(EntityId entityID)
{
    componentPool<T>* pool = GetOrCreatePool<T>();
    return pool->Create(entityID);
}

template <typename... Args>
decltype(auto) AddComponent(EntityId entityID)
{
    if constexpr (sizeof...(Args) == 1)
    {
        return AddComp <Args>(entityID);
    }
    else
    {
        return std::tuple<decltype(AddComponent<Args>({}))... > {AddComponent<Args>(entityID)...};
    }
}

但是我遇到了几个错误:

如果A *ptr_A = foo<A>(var);VS表示他不能从void转换为A *,则表示decltype(auto)正在以某种方式变为void

并在return AddComp <Args>(entityID);VS中表示必须扩展Args参数包。即使它是单个参数,我是否仍需要以某种方式扩展Args?

谢谢!

编辑:

根据要求,我提供了一个最小的例子

using EntityId = size_t;

class A
{
public:

int a;
};

class B
{
public:

int b;
};

class componentsManager
{
    
public:

template<typename T>
T* AddComp(EntityId entityID)
{
    return new T();
}

template <typename... Args>
decltype(auto) AddComponent(EntityId entityID)
{
    if constexpr (sizeof...(Args) == 1)
    {
        return AddComp <Args>(entityID);
    }
    else
    {
        return std::tuple<decltype(AddComponent<Args>({}))... > {AddComponent<Args>(entityID)...};
    }
}
    
};

componentsManager m_manager;
EntityId id;

A *ptr_A1 = m_manager.AddComponent <A>(id);
auto *[ptr_A2, ptr_B] =  m_manager.AddComponent<A, B>(id);// This will only compile in c++17 i believe, i am using c++14

编辑2:

我进入VS 2019时出错 VSError

伊戈尔·坦德尼克(Igor Tandetnik)

简单明了

if constexpr (sizeof...(Args) == 1)
{
    return AddComp<Args...>(entityID);
}

看起来工作正常。Clang演示MSVC演示


这是与C ++ 14一起使用的解决方案:

template <typename T>
decltype(auto) AddComponent(EntityId entityID)
{
  return AddComp<T>(entityID);
}

template <typename... Args>
decltype(auto) AddComponent(
    std::enable_if_t<(sizeof...(Args) > 1), EntityId> entityID)
{
    return std::tuple<decltype(AddComponent<Args>({}))...>{
        AddComponent<Args>(entityID)...};
}

演示版

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

具有可变参数列表的方法

具有可变参数模板参数的函数指针

可变参数模板类,从其参数列表中获取特定类型的索引

递归可变参数函数模板的返回类型的decltype

具有相同参数类型的可变参数模板函数

固定大小的容器到可变参数模板参数列表的转换

具有依赖类型的c ++ 11可变参数函数模板是否不明确?

可变参数模板函数,其中返回类型取决于模板参数列表

具有模板函数名称的可变参数模板

具有可变参数模板的成员函数指针

具有模板函数名称,传递参数和周围返回值的可变参数模板

具有双打的C ++可变参数模板

具有const引用的可变参数模板

没有函数模板“ max”的实例与参数列表匹配的参数类型为(int,int)

具有递归继承并使用声明的可变参数模板

参数列表中间的可变参数模板参数

std :: bind与可变参数模板和自动返回类型

非类型可变参数模板参数

c ++可变参数模板和模板模板参数:错误:模板参数列表中参数1的类型/值不匹配

C ++创建具有可变参数模板方法的接口

可变参数模板参数列表的std :: is_rvalue_reference的SFINAE失败

具有相同类型的可变参数模板参数的构造函数无法编译

如何具有类型和大小的可变参数模板?

具有相同类型参数的可变参数模板化函数

具有元组的C ++可变参数模板

可变参数模板函数确定函数指针的返回类型

是否可以构建具有不同类型的可变参数模板?

操作可变参数模板参数列表

从具有可变参数模板构造函数的类型构造 std::function 对象