Будут ли доступны ограничения шаблона для шаблонов переменных?

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

Нет никаких упоминаний о том, как эти функции могут взаимодействовать. Используя канонический пример числа Пи, мы могли бы получить следующее:

template<Integral T>
  constexpr double pi(3.141592653589793238);

template<Floating_point T>
  constexpr T pi(3.1415926535897932384626433832795029L);

Это приведет к тому, что числовое преобразование C / C ++ из целого в двойное. Это также предотвратило бы создание экземпляров с совершенно нерелевантными типами. (Глядя на это, мы могли бы захотеть заменить Floating_point чем-то, что требует ctor с плавающей запятой для поддержки сложных.)

Я что-то пропустил в одной из газет или это в разработке? Может, это бесплатно и не стоит упоминать?


person emsr    schedule 25.07.2013    source источник
comment
С пометкой c ++ 1y в соответствии с это мета-обсуждение.   -  person Casey    schedule 25.07.2013
comment
В первом примере вы не используете тип шаблона Integral, и в любом случае double не является целым. Похоже, вы пытаетесь специализировать constexpr шаблон. Это то, что вы хотите? Как это связано с ограничениями? Вы имеете в виду концепции? Concepts Lite находится в C ++ 14, но, опять же, это не относится к вашему примеру.   -  person cdmh    schedule 25.07.2013
comment
Я пытался специализировать шаблон переменных для целочисленных типов, чтобы повысить их до удвоения (это то, что делают математические функции в библиотеке). Может, я испортил синтаксис. Я хотел, чтобы «Интеграл» направил в эту специализацию, а не использовал ее.   -  person emsr    schedule 25.07.2013
comment
@cdmh, Concepts Lite отсутствует в C ++ 14   -  person Jonathan Wakely    schedule 26.07.2013
comment
@JonathanWakely правда? Спасибо за разъяснения, я думал, они сделали это.   -  person cdmh    schedule 26.07.2013


Ответы (1)


В последней версии предложения ( N4040 от мая 2014 г.) ответ будет НЕТ:

5 Шаблон переменной имеет следующие ограничения:

- Шаблон не должен иметь ограничений.

- Объявленный тип должен быть bool.

- Объявление должно иметь инициализатор.

- Инициализатор должен быть ограничивающим выражением.

[ Пример:

template<typename T>
concept bool D1 = has_x<T>::value; // OK

template<typename T>
concept bool D2 = 3 + 4;           // Error: initializer is not a constraint

template<Integral T>
concept bool D3 = has_x<T>::value; // Error: constrained concept definition

- конец примера]

person TemplateRex    schedule 22.07.2014
comment
@emsr приемлем ли этот ответ в его нынешней форме, или мне нужно решить с ним некоторые проблемы? - person TemplateRex; 29.07.2014