Ограничение диапазона значения вводит в C++

Вы должны объявить obj.item как массив, и вместо приравнивания значений вы должны помещать их в массив

const array = [{
  name: []
}];

const test = `result1
result2
result3`;
const ways = test.split(/[\n\r]+/).map(aaa => (aaa));

array.forEach((obj) => {
  obj.item = [];
  ways.forEach((element) => {
    obj.item.push({
      result: element
    });
  });
});
console.log(array)

23
задан user23434 29 September 2008 в 12:43
поделиться

5 ответов

Можно сделать это использование, шаблоны - пробуют что-то вроде этого:

template< typename T, int min, int max >class LimitedValue {
   template< int min2, int max2 >LimitedValue( const LimitedValue< T, min2, max2 > &other )
   {
   static_assert( min <= min2, "Parameter minimum must be >= this minimum" );
   static_assert( max >= max2, "Parameter maximum must be <= this maximum" );

   // logic
   }
// rest of code
};
15
ответ дан 29 November 2019 в 01:52
поделиться

библиотека Boost Constrained Value <глоток> (1) позволяет, Вы для добавления ограничиваете к типам данных.

, Но необходимо ли считать совет" , Почему типы C++ с плавающей точкой не должны использоваться с ограниченными объектами? ", когда Вам нравится использовать его с типами плавающими (как проиллюстрировано в Вашем примере).

<глоток> (1) библиотека Boost Constrained Value еще не является официальной библиотекой Boost.

5
ответ дан 29 November 2019 в 01:52
поделиться

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

В C++ 0x стандарт, у Вас могла быть константа-expr, которая позволит такой ошибке быть произведенной все же.

(Это принимает, Вы хотите, чтобы он бросил ошибку, только если фактическое значение недопустимо. Если диапазоны не соответствуют, можно достигнуть этого)

1
ответ дан 29 November 2019 в 01:52
поделиться

Одна вещь помнить о шаблонах состоит в том, что каждый вызов уникального набора шаблонных параметров завершит генерацию "уникального" класса, для которого сравнения и присвоения генерируют ошибку компиляции. Могут быть некоторые гуру метапрограммирования, которые могли бы знать, как работать вокруг этого, но я не один из них. Мой подход должен был бы реализовать их в классе с проверками на этапе выполнения и перегрузил сравнение и операторы присваивания.

1
ответ дан 29 November 2019 в 01:52
поделиться

Я хотел бы предложить альтернативную версию для решения Kasprzol: предложенный подход всегда использует границы интервала типа. Можно получить еще некоторую гибкость и безопасность типов с реализацией, такой как это:

template<typename T, T min, T max>
class Bounded {
private:
    T _value;
public:
    Bounded(T value) : _value(min) {
        if (value <= max && value >= min) {
            _value = value;
       } else {
           // XXX throw your runtime error/exception...
       }
    }
    Bounded(const Bounded<T, min, max>& b)
        : _value(b._value){ }
};

Это позволит средству проверки типа ловить очевидные присвоения мисс, такие как:

Bounded<int, 1, 5> b1(1);
Bounded<int, 1, 4> b2(b1); // <-- won't compile: type mismatch

Однако более усовершенствованных отношений, где Вы хотите проверить, включен ли диапазон одного шаблонного экземпляра в диапазоне другого экземпляра, нельзя выразить в шаблонном механизме C++.

Каждая Ограниченная спецификация становится новым типом. Таким образом компилятор может проверить на несоответствия типов. Это не может проверить на более усовершенствованные отношения, которые могли бы существовать для тех типов.

1
ответ дан 29 November 2019 в 01:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: