私は2つの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)... };
}
構造体Aに使用すると、remake
テンプレートは期待どおりに機能します
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*, ...) への呼び出しの最初の形式は、ネストされた構造体がデータを取得しているが現在の形式では使用できない場所を明示的に示すことで、意図がはるかに明確になっていると思います。本当に、このエラーは、可変個引数テンプレートと初期化子リストの間の微妙な相互作用 (およびその理解の欠如) の結果である可能性があると感じています。または、私が完全に見逃していた完全に異なる何か。
最初のリメイク(B *、...)フォームで達成しようとしていることは可能ですか?もしそうなら、期待どおりに動作しない原因は何ですか?
追加: 目的
このパターンが必要なアプリケーションは、これらの POD に事前に割り当てられた配列を保持する、メモリを再利用する同種のデータ構造です。外部オブジェクトは、構造体の値を提供して POD の作成を要求できます。その時点で、データ構造は未使用の配列位置を見つけ、これらの値で埋めます。リメイクは次T* create(Args&&... args)
のようになります(コンテナはポインタ安定です)