Я не думаю, что это возможно, избегая как переменных времени выполнения, так и вспомогательной функции (надеясь, что кто-то может это опровергнуть).
И мне очень нравится ваше второе решение, но ... как насчет использования итераторов для y
(если y
поддерживает cbegin()
и итераторы, очевидно).
Что-то как (осторожно: код не проверен)
template <std::size_t Ii...., std::size_t Xsize, std::size_t Ysize>
constexpr container<Xsize> insert(container<Xsize> x, container<Ysize> const & y) {
auto it = y.cbegin();
((x[Ii] = *it++), ...);
return x;
}
Это почти ваше первое решение, но доступ к y
, увеличивающему итератор, должен быть (я полагаю, для последовательного обхода, для некоторых контейнеров) более эффективно (немного более эффективно), чем использование operator[]()
.
Но я также полагаю, что с хорошим оптимизатором заметной разницы нет.
Если Вы хотите, чтобы все биты в тестовой маске соответствовали:
if((value & mask) == mask) {...}
, Если Вы хотите, чтобы какой-либо единственный бит в тестовой маске соответствовал:
if((value & mask) != 0) {...}
различие является самым очевидным при тестировании значения на несколько вещей.
Для тестирования на исключение:
if ((value & mask) == 0) { }
В первую очередь - используют перечисления с FlagAttribute. Это - то, для чего это.
[Flags]
public enum Time
{
None = 0
Current = 1,
Past = 2,
Future = 4
All = 7
}
Тестирование затем сделано как это:
if ( (x & Time.Past) != 0 )
Или это:
if ( (x & Time.Past) == Time.Past )
последний будет работать лучше, если "Мимо" была комбинация флагов, и Вы хотели протестировать их всех.
Установка похожа на это:
x |= Time.Past;
Сбрасывание похоже на это:
x &= ~Time.Past;
Можно также хотеть добавить дополнительный метод как это
enum states {
Current = 0x1,
Past = 0x2,
Future = 0x4,
All = 0x7
};
static bool Is(this states current, states value) {
return (current & value) == value;
}
затем, можно сделать:
if(state.Is(states.Past)) {
// Past
}
if ((flags & PAST) == PAST)
{
// PAST is there
}
if ((flags & CURRENT) != CURRENT)
{
// CURRENT is not there
}
Вы могли использовать И на нем и проверить, совпадает ли результат с Вами и с?