Удержание аргумента шаблона класса в переменных-членах - PullRequest
1 голос
/ 06 марта 2019

Расширенная версия здесь .

Мы можем создавать объекты шаблонов классов, которые имеют параметры шаблона по умолчанию без ввода угловых скобок:

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<>;

Но это усложняет код реализации и совсем не элегантно.

1 Ответ

3 голосов
/ 06 марта 2019

Нет, это не ошибка. Это потому, что могут быть разные конструкторы, вызываемые для одной и той же переменной-члена (вызываемой через список инициализации конструктора класса), что потенциально может привести к разным результатам дедукции.

Чтобы предотвратить вероятность такого конфликта, вы должны предоставить нестандартные аргументы шаблона. (Статические члены не являются проблемой, потому что для них будет один вызов конструктора)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...