我有两个POD
struct A
{
float x;
float y;
};
struct B
{
A a;
int i;
}
和一个可变参数函数,它使用(我认为)聚合
就地分配PODtemplate<typename T, class... Args>
void remake(T* location, Args&&... args)
{
*T = { std::forward<Args>(args)... };
}
remake
模板在用于struct 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一起使用时(我认为是)支持elision
remake(b_ptr, 7.0f, 6.0f, 9)
我觉得我重新调用(B *,...)的第一种形式是通过明确地显示嵌套结构获取其数据但在当前形式中无法使用的意图更清晰。我确实认为错误可能是可变参数模板和初始化列表之间的微妙交互(以及缺乏理解)的结果。或者完全不同的东西,我完全错过了。
我试图在第一次翻拍(B *,...)形式中完成的是什么? 如果是这样,我做错了什么,以防止它按预期工作?
添加:目的
我想要这种模式的应用程序是一个内存重用的同类数据结构,它为这些POD保存预先分配的数组。外部对象可以请求创建POD,提供结构值,此时数据结构将找到未使用的数组位置并使用这些值填充它。所以翻拍看起来像T* create(Args&&... args)
(容器是指针稳定的)