Можно ли определить 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;
}
Нет, это невозможно. Из стандарта §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<>;
Плюс, это больше печатать!