В последней статье о шаблонных ограничениях представлен новый набор инструментов для ограничения аргументов шаблона. Также в 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.)
Я что-то пропустил в одной из газет или в работе? Может быть, это бесплатно и не стоит упоминать?
В последней версии предложения (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
— конец примера]
Других решений пока нет …