Может кто-нибудь помочь мне просветить этот шаблон? - PullRequest
1 голос
/ 15 апреля 2020

Я знаю, что заголовок отстой, просто я не был уверен, как еще спросить об этом, потому что мне не хватает знаний по многим базовым c C ++ функциям, и я пытаюсь обратиться к ним один за другим .

Итак, я начинаю погружаться в шаблоны C ++. Сейчас я создаю действительно базовые c, просто чтобы помочь мне отладить мой код, например:

    void printVectors(const T& vec, const S& vec2) {
        for (int i = 0; i < vec.size(); i++) {
            print("------------");
            printNoEndln(vec[i]);
            printNoEndln("->");
            print(vec2[i]);
        }
    }

Теперь, начиная с SDL, я наткнулся на что-то вроде этого:

    template <typename T, typename... TArgs>
    T& AddComponent(TArgs&&... args) {
        T* newComponent(new T(std::forward<TArgs>(args)...));
        newComponent->componentName = typeid(T).name();
        newComponent->owner = this;
        components.emplace_back(newComponent);
        newComponent->Init();
        return *newComponent;
    }

Итак, я построчно опишу, что я понимаю, этой строкой, и я был бы очень рад, если бы вы, ребята, могли меня поправить.

1- Создание шаблона типа T с N аргументы (То, что здесь означает оператор распространения, верно? Он объявляет шаблон c variadi?)

2 - Объявление функции AddComponent, которая возвращает ссылку на T и получает N ссылок на ссылки Тип TArgs (???) (Эта часть меня действительно смущает).

3 - Объявление указателя T на новый объект типа T очень странным образом. Для начала, я не понимаю, почему к экземпляру newComponent обращаются с помощью (), например newComponent() вместо T* newComponent = new Component(...) (Серьезно, это все, что я могу извлечь asp из этой строки)

От строки 4 и далее код очень прост для меня и не нуждается в объяснении.

Из того, что я мог понять, мой пробел не в состоянии понять: шаблоны * variadi c и функции, значения, lvalues ​​и проблема вперед. Это верно? Ребята, можете ли вы указать мне полезные статьи на эти темы? Я нахожу большинство cpp ссылок очень формальными и далеко за пределами моей лиги. Забавно, что я могу читать документацию C#, Java, Typescript и Javascript без проблем, но когда дело доходит до C ++, становится действительно сложно извлечь что-то из документации. Обычно я просто пропускаю формальность к действительному примеру кода, а затем сам пробую его на компиляторе, чтобы понять, что происходит.

Я знаю, что это много, отвечайте любой информацией, которую вы считаете полезной.

Спасибо, ребята

1 Ответ

1 голос
/ 15 апреля 2020
template <typename T, typename... TArgs>
T& AddComponent(TArgs&&... args)

Это объявление шаблона функции AddComponent. T и TArgs являются аргументами шаблона, оба из которых должны быть типами. TArgs - это аргумент переменной c (может содержать 0 или более типов). Шаблон функции выделяет функции для каждой уникальной комбинации T и TArgs, например, AddComponent<int,long,float> может быть такой функцией.

TArgs&&... называются ссылками пересылки , поскольку && внутри объявления шаблона имеет эффект сохранения категории значений (lvalue / rvalue) из аргумент (ы).

    T* newComponent(new T(std::forward<TArgs>(args)...));

Это определение локальной переменной newComponent типа указатель на- T и начальное значение new T(std::forward<TArgs>(args)...).

std::forward - вспомогательная утилита, которая работает вместе с TArgs&& и при необходимости передает rvalue ссылки на вызов. При просмотре кода вы можете игнорировать его и читать new T(std::forward<TArgs>(args)...) как new T(args...). Теперь это variadi c пакет расширения синтаксис; здесь аргументы args из шаблона просто передаются в new().

Для более подробной информации обратитесь к вашей любимой C ++ Book . Моим любимым (годы go) был Effective Modern C ++ Скотта Мейерса (Скотт называет переадресацию ссылок универсальные ссылки , в остальном - отличная книга).

...