2011-07-21 2 views
2

У меня есть класс статистики шаблона, который имеет параметры диапазона.Использование numeric_limits для значений параметров по умолчанию

template <typename T> 
class limitStats 
{ 
public: 
    limitStats(T mx, T min) : 
     max(mx), 
     min(mn), 
     range(mx-mn) 
    {;} 

private: 
    const T max; 
    const T min; 
    const T range; 
} 

Я хотел бы поставить значения максимальных и минимальных допустимых значений по умолчанию, но минимальное значение не совпадает с плавающей точкой и целых типов.

Обычно я могу написать

T min_val = numeric_limits<T>::isinteger ? numeric_limits<T>::min() : -numeric_limits<T>::max(); 

Я обнаружил, что я не могу использовать его в качестве параметра по умолчанию

limitStats(T mx = std::numeric_limts<T>::max(), 
      T mn = numeric_limits<T>::isinteger ? numeric_limits<T>::min() : -numeric_limits<T>::max()) 

Есть ли способ достижения чего-то подобного?

ответ

3

Возможно, вы захотите переосмыслить свой дизайн. Что вы пытаетесь сделать с вашим limitStats, который std::numeric_limits не предоставляет?

Не повторяйте ошибку дизайна std::numeric_limits. Например, std::numeric_limits<double>::min() ужасно неправильно. Минимальный двойник - это аддитивная инверсия максимального двойника. std::numeric_limits - это злоупотребление нотами и злоупотреблением шаблонами. На мой взгляд, конечно.

Ваша идея для min неадекватна. Подумайте о своем стандарте относительно limitStats<unsigned int>.

С по умолчанию ваш range недействителен для целых чисел со знаком. Для unsigned ints он реплицирует max, если исправить проблему с помощью limitStats<unsigned int>::min. Для типов с плавающей запятой он либо недействителен, либо реплицирует max, в зависимости от того, что вы подразумеваете под limitStats<floating_point_type>::min.

Имеет ли смысл иметь значения по умолчанию? У вас даже не возникло бы такого вопроса, если бы вы просто не предоставляли значения по умолчанию и делали конструктор по умолчанию private/unimplemented.

2

Есть так много синтаксических ошибок и опечаток, что трудно сказать, какой из них является ваша проблема.

numeric_limits является шаблон, поэтому вы получаете доступ к ней как numeric_limits<int>::is_integer или с типом шаблона numeric_limits<T>::max().

0

Я просто ударил тот же вопрос при попытке иметь сигнатуру функции, как показано ниже в ОС Windows на Visual Studio при попытке создать DLL

int 
GetARandomNum(
    int lowest = std::numeric_limits<int>::min(), 
    int highest = std::numeric_limits<int>::max()); 

При попытке различные вещи, я решил удалить #inlcude <windows.h> из stdafx.h и вещи начали нормально строиться. Учитывая, что «stdafx.h» выбран по умолчанию в VS и не включает его или нет, не имеет никакого значения для построения ошибки, я решил просто переместить #inlcude <windows.h> из stdafx'h в файлы cpp, где бы это ни было необходимо, что в случае проекта DLL обычно только в dllmain.cpp. Я не знаю, почему Windows.h возился с заголовками C + 11, но раньше я видел аналогичную проблему.

Смежные вопросы