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

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

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

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

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

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

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

2

Решение

В последней версии предложения (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

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

2

Другие решения

Других решений пока нет …