(Примітка. Це питання стосується того, що не потрібно вказувати кількість елементів і все ж дозволяти вкладеним типам безпосередньо ініціалізувати.)
У цьому питанні розглядаються питання, які залишилися для масиву С, як int arr[20];
. У своїй відповіді @James Kanze показує одну з останніх оплотів масивів C, це унікальні характеристики ініціалізації:
int arr[] = { 1, 3, 3, 7, 0, 4, 2, 0, 3, 1, 4, 1, 5, 9 };
Нам не потрібно вказувати кількість елементів, ура! Тепер перегляньте його за допомогою функцій C ++ 11 std::begin
та std::end
від <iterator>
( або власних варіантів ), і вам ніколи не потрібно навіть думати про його розмір.
Тепер, чи є (можливо TMP) способи досягти того ж std::array
? Використання макросів дозволило зробити його красивішим. :)
??? std_array = { "here", "be", "elements" };
Правка : Проміжна версія, складена з різних відповідей, виглядає приблизно так:
#include <array>
#include <utility>
template<class T, class... Tail, class Elem = typename std::decay<T>::type>
std::array<Elem,1+sizeof...(Tail)> make_array(T&& head, Tail&&... values)
{
return { std::forward<T>(head), std::forward<Tail>(values)... };
}
// in code
auto std_array = make_array(1,2,3,4,5);
І використовує всі цікаві матеріали C ++ 11:
- Варіантні шаблони
sizeof...
- rvalue посилання
- ідеальне переадресація
std::array
, звичайно- рівномірна ініціалізація
- опущення типу повернення з рівномірною ініціалізацією
- тип висновку (
auto
)
І приклад можна знайти тут .
Однак , як @Johannes вказує у коментарі до відповіді @ Xaade, ви не можете ініціалізувати вкладені типи з такою функцією. Приклад:
struct A{ int a; int b; };
// C syntax
A arr[] = { {1,2}, {3,4} };
// using std::array
??? std_array = { {1,2}, {3,4} };
Також кількість ініціалізаторів обмежена кількістю аргументів функцій та шаблонів, підтримуваних реалізацією.
TMP
вашого запитання?