Расширенная версия здесь .
Мы можем создавать объекты шаблонов классов, которые имеют параметры шаблона по умолчанию без ввода угловых скобок:
int main()
{
std::less a;
}
Но мы не можем сделать это для переменных-членов:
struct S
{
std::less a; // I want only type std::less<void> here
};
Похоже, что первый случай работает из-за CTAD , но почему компилятор не может вывести std::less<void>
во втором случае? Может быть, мы не должны применять CTAD там, но предоставляем другой механизм.
Это считается ошибкой в стандарте? Есть предложение исправить это?
Мой вариант использования:
У меня есть шаблон класса, который предоставляет аргумент по умолчанию, например:
template <typename T = int>
class Foo {};
Параметр шаблона - это функция только для экспертов, которой я сам никогда не пользуюсь, но она доступна для тех 1% экспертов, которым нужна полная гибкость. Теперь для других 99% я хочу скрыть тот факт, что Foo
на самом деле является шаблоном класса, но он не работает, потому что пользователи должны вводить Foo<>
при объявлении его в качестве переменной-члена, текущее решение таково:
template <typename T = int>
class BasicFoo {};
using Foo = BasicFoo<>;
Но это усложняет код реализации и совсем не элегантно.