Bedenken Sie:Emulate Aggregat Initialisierung für rekursiv definierte Array-ähnliche Klasse
template <std::size_t r,std::size_t d>
struct Tensor
{
Tensor<r-1u,d> Data[d];
};
template <std::size_t d>
struct Tensor<0u,d>
{
double Data;
};
Wir Kopie-list-Initialisierung eine solche Tensor
auf diese Weise initialisieren können:
Tensor<2u,3u> t= { 1.0, 2.0, 3.0,
4.0, 5.0, 6.0,
7.0, 8.0, 9.0 };
Notiere die Klammer elision .
Dies funktioniert auch in einem generischen Programmierkontext, z.B.:
template <typename... T,
typename= std::enable_if_t<(std::is_same_v<T,double> && ...) && (sizeof...(T)==9u)>>
Tensor<2u,3u> MakeTensor(T... x) { return {x...}; }
Wenn jedoch Data
privat waren, Tensor
wäre nicht mehr ein Aggregat sein, und somit würde die obige Syntax keine Gültigkeit.
In diesem Fall konnte dieses Verhalten programmgesteuert wiederhergestellt werden?
Aggregat Initialisierung benötigt ein Aggregat, also nicht streng genommen; Sie können es über einen Initialisiererlisten-Konstruktor emulieren, obwohl –
... oder ein Konstruktor, der eine Aggregatversion Ihrer Tensordatenstruktur verwendet, die nur für Initialisierungszwecke verwendet wird –
@MassimilianoJanes Ja. Das könnte funktionieren. Vielleicht "Tensor" in "TensorData" umbenennen, so dass der eigentliche Tensor eine private Instanz von "TensorData" und entsprechende Konstruktoren hat. Möchten Sie eine Antwort ausarbeiten? – metalfox