используя объявление специализированного класса шаблона переменной

Можно ли определить FloatType таким образом, что я могу объявить f1 как

FloatType f1;

вместо

FloatType<> f1;

Если я пытаюсь использовать первое, я получаю

error: use of class template 'FloatType' requires template arguments

template <typename T, typename... Args>
class Type
{
};

template <typename... Args>
class Type<float, Args...>
{
};

template <typename... Args>
using FloatType = Type<float, Args...>;

int
main(int, char **)
{
FloatType<> f1;
FloatType<float> f2;

return 0;
}

2

Решение

Нет, это невозможно. Из стандарта §14.3 / 4, акцент мой:

Когда аргумент шаблона упаковывается или используется по умолчанию Шаблон-аргументы используются, Шаблон-аргумент список может быть
пустой. В этом случае пустой <> скобки все еще будет использоваться как Шаблон-аргумент-список. [ Пример:

  template <class T = char> class String;
String<>* p; // OK: String<char>
String* q;   // syntax error

template <class ... Elements> class Tuple;
Tuple<>* t; // OK: Elements is empty
Tuple* u;   // syntax error

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

Но тогда, что не так с написанием FloatType<>? Если вид пустых скобок действительно раздражает вас, вы можете ввести для них другой псевдоним, но это запутывает вещи:

using DefFloatType = FloatType<>;

Плюс, это больше печатать!

4

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


По вопросам рекламы [email protected]