У меня есть определенная и инициализированная структура данных, подобная следующей:
#include <vector>
#include <array>
struct SomeStruct {
std::vector<int> vec;
};
int main() {
std::array<SomeStruct, 2> arr {
SomeStruct {
.vec = {
1, 2
}
},
SomeStruct {
.vec = {
3, 4, 5
}
}
};
}
Это компилируется правильно, но, поскольку вся структура известна во время компиляции, я попытался сделать ее constexpr
.
Простое объявление arr
как constexpr
в предыдущем примере приводит к ошибке:
main.cpp: In function ‘int main()’:
main.cpp:20:5: error: the type ‘const std::array’ of constexpr variable ‘arr’ is not literal
};
^
In file included from main.cpp:2:0:
/usr/include/c++/7/array:94:12: note: ‘std::array’ is not literal because:
struct array
^~~~~
/usr/include/c++/7/array:94:12: note: ‘std::array’ has a non-trivial destructor
Я предполагаю, что это потому, что std::vector
не имеет constexpr
конструктор / деструктор.
Затем я попытался использовать std::array
с шаблоном для содержащей структуры:
#include <array>
template <int N>
struct SomeStruct {
std::array<int, N> vec;
};
int main() {
constexpr std::array<SomeStruct, 2> arr {
SomeStruct<2> {
.vec = {
1, 2
}
},
SomeStruct<3> {
.vec = {
3, 4, 5
}
}
};
}
Это также приводит к ошибке:
main.cpp: In function ‘int main()’:
main.cpp:10:39: error: type/value mismatch at argument 1 in template parameter list for ‘template struct std::array’
constexpr std::array<SomeStruct, 2> arr {
^
main.cpp:10:39: note: expected a type, got ‘SomeStruct’
main.cpp:10:41: error: scalar object ‘arr’ requires one element in initializer
constexpr std::array<SomeStruct, 2> arr {
^~~
Но я не могу дать SomeStruct параметр шаблона, потому что размеры могут отличаться.
Каков наилучший способ определения структуры данных constexpr
, подобной этой?