Тип контейнера и вычет типа времени компиляции - PullRequest
0 голосов
/ 12 сентября 2018

Я хочу иметь вектор целых чисел и некоторый код, который обрабатывает этот вектор наиболее общим способом (во время компиляции) w.r.t. тип векторного элемента. E.g.:

std::vector<uint16_t> X;
...
X.push_back(rand() % std::numeric_limits<X::value_type>::max());

Но компилятор говорит:

the value of X is not usable in a constant expression

Почему нельзя использовать X::value_type в таком контексте? Я имею в виду, что тип элемента X не может измениться, если он объявлен с конкретным типом элемента, и это можно сделать из синтаксиса только этого фрагмента кода. И какой должен быть подход, если я изменю объявленный тип элемента X (другое целое число), но не хочу изменять строку push_back из-за этого изменения? Я предполагаю любой современный стандарт C ++.

Ответы [ 2 ]

0 голосов
/ 12 сентября 2018

Если вы измените его на вызов value_type для типа (вместо экземпляра - я не думаю, что это допустимый C++), он скомпилируется и будет работать ( godbolt ).

using vec_t = std::vector<uint16_t>;
vec_t X;
// or the other way around:
// auto X = std::vector<uint16_t>();
// using vec_t = decltype(X);
X.push_back(rand() % std::numeric_limits<vec_t::value_type>::max());
0 голосов
/ 12 сентября 2018

X - это имя объекта, а не его тип.Вы можете использовать decltype (начиная с C ++ 11), чтобы получить тип X.

X.push_back(rand() % std::numeric_limits<decltype(X)::value_type>::max());
...