Скажем, у меня есть тип, который нельзя ни перемещать, ни копировать:
struct foo
{
explicit foo( size_t ){}
~foo(){}
foo( foo const & ) = delete;
foo( foo && ) = delete;
foo& operator=( foo const & ) = delete;
foo& operator=( foo & ) = delete;
};
Теперь, учитывая число, известное во время компиляции (назовем его N), есть ли способ создать «последовательность» из них в стеке, причем каждый из них инициализируется числами от 0 до N-1? Я бы удовлетворился массивом в стиле C foo[N]
, std::array< foo, N >
или, возможно, даже каким-нибудь std::tuple
.
Чего я пытаюсь избежать, так это написать:
foo f0( 0 ), f1( 1 ), ... fNminus1( N-1 );
когда мне кажется, что это то, что компилятор должен сделать за меня. Лучшее, что я смог придумать, это использовать boost::optional
.
boost::optional< foo > f[N];
for( size_t i = 0U; i < N; ++i )
f[i] = boost::in_place( i );
Но это зависит от логики времени выполнения, хотя вся необходимая информация доступна во время компиляции. Кроме того, у меня осталось что-то, что ведет себя как массив указателей.