Опустить пустое <> в шаблонах C ++ - PullRequest
0 голосов
/ 19 декабря 2018

Есть ли способ опустить пустое <> в C ++ 11, чтобы сделать синтаксис более приятным, что означает написание Foo вместо Foo<> для шаблона класса.

Мне ясно, что я могу переименовать / пространство имен и т. Д. Класс.Но я хочу оптимизировать два символа, не путая пользователя с новым именем и не заставляя его печатать намного больше, чем раньше.

Полный пример:

template<int N = 1>
class Foo{};

using Foo = Foo<>;
int main()
{
  Foo foo; // I want to be able to write this.
  Foo<> foo; // Works but is ugly.
}

1 Ответ

0 голосов
/ 21 декабря 2018

У вас есть только одна опция, чтобы этот синтаксис работал, и это переключается на C ++ 17 .Затем вы можете просто пропустить аргумент шаблона, потому что аргументы шаблона по умолчанию всегда могут быть выведены как часть нового вывода аргумента шаблона класса (иногда называемого «руководством по выводу»).

template<int N = 1>
class Foo{};

int main() {
    { Foo foo; }
    { Foo<> foo; }
}

Live on Wandbox


В зависимости от того, какие компромиссы вы можете сделать, есть два решения, которые работают с C ++ 11 .

  1. Использование другого имени для шаблона псевдонима.

    template<int N = 1>
    class Foo{};
    
    using FooNoArgs = Foo<>;
    
    int main() {
        { FooNoArgs foo; }
        { Foo<> foo; }
    }
    

    Live on Wandbox

  2. Перемещениешаблон в собственное пространство имен в сочетании с локальным using, если вам нужен доступ к шаблонному варианту.

    namespace foo {
    template<int N = 1>
    class Foo{};
    }
    
    using Foo = foo::Foo<>;
    
    int main() {
        { Foo foo; }
        { using foo::Foo; Foo<> foo; }
    }
    

    Live on Wandbox

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