Вы можете легко сделать это из словаря списков:
public class MultiValueDictionary<Key, Value> : Dictionary<Key, List<Value>> {
public void Add(Key key, Value value) {
List<Value> values;
if (!this.TryGetValue(key, out values)) {
values = new List<Value>();
this.Add(key, values);
}
values.Add(value);
}
}
После изучения этого еще немного это похоже signaling_NaN
, бесполезно как предусмотрено. Если исключения в операции с плавающей запятой включены, то вызов его рассчитывает как обработка сигнального NaN, таким образом, это сразу повышает исключение. Если исключения в операции с плавающей запятой отключены, то обработка сигнального NaN автоматически понижает его до тихого NaN, таким образом signaling_NaN
не работает так или иначе.
код Menkboy работы, но пытающийся использовать сигнальный NaNs сталкивается с другими проблемами: нет никакого портативного способа включить или отключить исключения в операции с плавающей запятой (как сослался на здесь и здесь ), и если Вы полагаетесь на включаемые исключения, сторонний код может отключить их (как описано здесь ).
, Таким образом, это походит , решением Motti является действительно лучший выбор.
Чем передача сигналов, которую означает NAN, состоит в том, что, когда ЦП встречается с ним, сигнал запущен, (отсюда имя). Если Вы хотите обнаружить неинициализированные переменные, затем повышающие уровень предупреждения на Вашем компиляторе, обычно обнаруживает все пути то использование uninitalized значения. Сбой этого, можно использовать класс обертки, который хранит булевскую переменную, говорящую, инициализируется ли значение:
template <class T>
class initialized {
T t;
bool is_initialized;
public:
initialized() : t(T()), is_initialized(false) { }
initialized(const T& tt) : t(tt), is_initialized(true) { }
T& operator=(const T& tt) { t = tt; is_initialized = true; return t; }
operator T&() {
if (!is_initialized)
throw std::exception("uninitialized");
return t;
}
};
Можно записать сигнальный NaN в переменную, не инициировав исключение с чем-то вроде этого (nb: непротестированный)
void set_snan( double &d )
{
long long *bits = (long long *)&d;
*bits = 0x7ff0000080000001LL;
}
Это будет работать большинство мест, но не, это не 100%-е портативное устройство.
Ваша реализация C++ может иметь API для доступа к среде с плавающей точкой, чтобы протестировать на и очистить определенные исключения в операции с плавающей запятой. См. мой ответ на связанный вопрос для получения дополнительной информации.
Ну, заботясь об определении и тихого и сигнального NaN, я не могу действительно разобрать различие.
Вы могли использовать код, который используется в тех функциях сами, возможно, он предотвращает исключение тот путь, но видящий исключение в тех двух функциях, я думаю, что он мог бы быть связан с чем-то еще.
, Если Вы хотите непосредственно присвоить NaN:
double value = _Nan._Double;