pattern matching or partial specialization for using type definitions and for inline variables

post-increment
post-increment

Допустим, мы хотим написать банальный "трейт" для своих типов.
Например, best_floating_point_t<T>.
Первый вариант это писать класс best_floating_point<T> и специализировать его для каждого особого случая.
А далее уже использовать using для определения best_floating_point_t<T>.
Должно выглядеть примерно так

template<typename T>
best_floating_point_t = typename best_floating_point<T>::type;

Предлагается сделать возможным такой синтаксис:

template<typename T> 
using best_floating_point_t = some_default_case;
//specializations
template<> using best_floating_point_t<int> = float;
template<> using best_floating_point_t<long> = double;
template<> using best_floating_point_t<some_user_type> = double;

Аналоично можно сделать для inline variables:

template<typename T>
inline const std::string type_name = "unknown";

template<> inline const std::string type_name<int> = "int";
template<> inline const std::string type_name<double> = "double";



-3
рейтинг
1 комментарий
Andrey Davydov

Для template variables специализация возможно уже сейчас -- ровно ваш пример будет компилироваться и работать.

Для template type alias специализация это плохая идея, она противоречит смыслу template type alias'а, а именно, то что он не самостоятельная сущность, а всего лишь alias. В частности, в стандарте приведен следующий пример: 

template<class T> struct Alloc { /* ... */ };
template<class T> using Vec = vector<T, Alloc<T>>;

Vec<int> v; // same as vector<int, Alloc<int>> v;

template<class T>
  void process(Vec<T>& v)
  { /* ... */ }

template<class T>
  void process(vector<T, Alloc<T>>& w)
  { /* ... */ } // error: redefinition
Andrey Davydov
Другие идеи
Группа создана, чтобы собирать предложения к стандарту C++, организовывать их внутренние обсуждения, помогать готовить их для отправки в комитет и защищать на общих собраниях в рабочей группе по С++ Международной организации по стандартизации (ISO).
Все предложения