1

我有两个 POD

struct A
{
   float x;
   float y;
};

struct B
{
   A a;
   int i;
}

和一个可变参数函数,它使用(我认为是)聚合就地分配 POD

template<typename T, class... Args>
void remake(T* location, Args&&... args)
{
   *T = { std::forward<Args>(args)... };
}

remake模板在用于结构 A 时按预期工作

remake(a_ptr, 7.0f, 6.0f)

但是在没有大括号省略的情况下用于 B 时会出错:No instance of template function 'remake' matches argument list. Argument types are: (B*, {...}, int)

remake(b_ptr, {7.0f, 6.0f}, 9)

并在与 B 一起使用时使用(我认为是)大括号省略

remake(b_ptr, 7.0f, 6.0f, 9)

我觉得我调用 remake(B*, ...) 的第一种形式通过明确显示嵌套结构正在获取其数据但在其当前形式中不可用的位置,意图更加清晰。真的,我觉得这个错误可能是可变参数模板和初始化列表之间微妙交互的结果(以及缺乏对它们的理解)。或者我完全错过的完全不同的东西。

我想在第一个 remake(B*, ...) 形式中完成的工作可能吗?如果是这样,我做错了什么导致它无法按预期工作?


加法:目的

我想要这种模式的应用程序是一个内存重用同构数据结构,它为这些 POD 保存预分配的数组。外部对象可以请求创建 POD,提供结构值,此时数据结构找到未使用的数组位置并用这些值填充它。所以 remake 看起来像T* create(Args&&... args)(容器是指针稳定的)

4

0 回答 0