Использование numeric_limits для значений параметров по умолчанию - PullRequest
2 голосов
/ 21 июля 2011

У меня есть шаблон статистики класса, который имеет параметры диапазона.

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())

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

Ответы [ 4 ]

3 голосов
/ 21 июля 2011

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

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

Ваша идея для min неверна.Подумайте о вашем значении по умолчанию в отношении limitStats<unsigned int>.

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

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

2 голосов
/ 21 июля 2011

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

numeric_limits - это шаблон, поэтому вы обращаетесь к нему как numeric_limits<int>::is_integer или с типом шаблона.numeric_limits<T>::max().

1 голос
/ 21 июля 2011

Используйте

boost::numeric::bounds<T>::lowest()

См. http://www.boost.org/doc/libs/1_33_1/libs/numeric/conversion/doc/bounds.html

0 голосов
/ 19 апреля 2015

Я просто столкнулся с той же проблемой, когда пытался создать сигнатуру функции, как показано ниже, в 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, но я также видел подобную проблему ранее.

...