Стандарт не допускает плавающие точки как шаблонные аргументы не-типа , о которых можно прочитать в следующем разделе C ++ 11,
14.3.2 / 1 & nbsp; & nbsp; & nbsp; & nbsp; Шаблон не-типа аргументов & nbsp; & nbsp; & nbsp; & nbsp; [temp.arg.nontype]
Аргумент шаблона для непигового шаблона-шаблона без шаблона должен быть одним из:
blockquote>
- для не-типа шаблон-параметр интегрального или перечисляемого типа, преобразованное константное выражение (5.19) типа шаблона-параметра;
- имя непигового шаблона-параметра; или
- константное выражение (5.19), которое обозначает адрес объекта со статической продолжительностью хранения и внешней или внутренней связью или функцию с внешней или внутренней связью, включая шаблоны функций и идентификаторы шаблонов функций, -статические члены класса, выраженные (игнорируя круглые скобки) как & amp; id-expression, за исключением того, что & amp; может быть опущено, если имя относится к функции или массиву и должно быть опущено, если соответствующий шаблон-параметр является ссылкой; или
- константное выражение, которое вычисляет значение нулевого указателя (4.10); или
- константное выражение, которое вычисляет значение указателя пустого элемента (4.11); или
- указатель на элемент, выраженный как описано в 5.3.1.
Но .. но .. ПОЧЕМУ??
Вероятно, это связано с тем, что вычисления с плавающей запятой не могут быть представлены точно. Если это было разрешено, это могло бы / приводило бы к ошибочному / странному поведению при выполнении чего-то такого:
func<1/3.f> (); func<2/6.f> ();
Мы хотели дважды вызвать ту же функцию, но это может быть не так, поскольку представление с плавающей запятой
Как я представляю значения с плавающей запятой в качестве аргументов шаблона?
С помощью
C++11
вы могли бы написать некоторые довольно продвинутые константные выражения ( constexpr ), которые вычисляли числитель / знаменатель времени компиляции с плавающим значением, а затем передавали эти два в виде отдельных целых аргументов.Не забудьте определить какой-то порог, так что значения с плавающей запятой, близкие друг к другу, дают один и тот же числитель / знаменатель , в противном случае это бесполезно, так как тогда он даст тот же результат, который ранее упоминался как причина не разрешить значения плавающей запятой в качестве аргументов шаблона непигового типа .