Параметризация функций с помощью классов и доступа к членам класса - PullRequest
0 голосов
/ 28 января 2019

Мне интересно, как именно этот код работает в деталях (например, как он может напрямую получить доступ к значению TYPE).

Я видел этот код в большей кодовой базе (которая не является общедоступной,поэтому пример перефразирован).Я никогда не видел этот конкретный вариант использования.Является ли передача параметра шаблона подобным образом?У него есть конкретное имя / это идиома / шаблон?Когда бы вы использовали это и почему?

#include <iostream>

namespace FileA
{
struct Foo
{
    enum TYPE
    {
        ENTRY,
    };

    void callme()
    {
        std::cout << "Foo\n";
    }
};
}

namespace FileB
{
template <typename T>
void fun(T& obj)
{
    std::cout << T::ENTRY << "\n";
    obj.callme();
}
}

int main()
{
    FileA::Foo f;
    FileB::fun(f);
}

Это напечатает:

0
Foo

1 Ответ

0 голосов
/ 28 января 2019

шаблон является своего рода макросом в общем смысле этого слова, поэтому, если вы "разверните" FileB::fun(f); T, будет заменен типом f , являющимся FileA::Foo и это похоже на то, что если у вас есть:

void fun(FileA::Foo& obj)
{
    std::cout << FileA::Foo::ENTRY << "\n";
    obj.callme();
}

, поскольку FileA::Foo::ENTRY равно 0, std :: cout записывает 0, то вы применяете FileA::Foo::callme(), чьи отпечатки Foo

Предупреждение, шаблон намного больше, это просто очень упрощенное объяснение того, как этот пример работает и производит выходные данные, не воспринимайте его буквально, пожалуйста ^^

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