Довольно важно понимать, что эти операторы возвращают другие<integral_constant>с, а не нормальные значения интегрального типа. На самом деле, все эти операторы работают примерно одинаково. Проще говоря, для оператора<@>,
integral_constant<T, x>{} @ integral_constant<T, y>{} == integral_constant<T, x @ y>{}
Тот факт, что операторы возвращают<Constant>s, очень важен, поскольку он позволяет сохранять всю информацию, известную во время компиляции, до тех пор, пока она используется только с другими значениями, известными во время компиляции. Интересно также отметить, что всякий раз, когда<integral_constant>сочетается с нормальным значением времени выполнения, результатом будет значение времени выполнения (из-за неявного преобразования). В общем, это дает нам следующую таблицу.
МодельConstantестественно вытекает из моделиIntegralConstant, т.е.
значение>() == v// типа T
The model of Constant follows naturally from the model of IntegralConstant, i.e.
value<integral_constant<T, v>>() == v // of type T
[ORIG_END] -->
Comparable,Orderable,Logical,Monoid,Group,RingиEuclideanRing,Hashable Эти модели являются именно теми, которые предусмотрены дляConstants, которые документированы в их соответствующих концепциях.
Буквальный анализируется во время компиляции, и результат возвращается как<llong<...>>.
Note
We use llong<...> instead of ullong<...> because using an unsigned type leads to unexpected behavior when doing stuff like -1_c. If we used an unsigned type, -1_c would be something like ullong<-1> which is actually ullong<something huge>.
Example
using namespace hana::literals; // contains the _c suffix
Обратите внимание, что<times>действительно является объектом статической функции, а не просто статической функцией. Это позволяет<int_<n>::times>перейти к алгоритмам более высокого порядка:
std::string s;
BOOST_HANA_CONSTEXPR_LAMBDA auto functions = hana::make_tuple(
Кроме того, поскольку к статичным элементам можно получить доступ с использованием синтаксиса<.>и<::>, можно воспользоваться этим (лазейкой?) для вызова<times>на объекты, а также на типы:
Помните, что<times>являетсяфункциональным объектоми, следовательно, может иметь подобъекты.<with_index>— это просто функциональный объект, вложенный внутрь<times>, который позволяет использовать этот приятный маленький интерфейс. Также отметим, что индексы, переданные функции<integral_constant>s; они известны во время компиляции. Следовательно, мы можем делать с ними компиляции времени, такие как индексация внутри кортежа:
times.with_index(f) guarantees that the calls to f will be done in order of ascending index. In other words, f will be called as f(0), f(1), f(2), etc., but with integral_constants instead of normal integers. Side effects can also be done in the function passed to times and times.with_index.
Статья Boost.Hana: boost::hana::integral_constant< T, v > Struct Template Reference раздела может быть полезна для разработчиков на c++ и boost.
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.