Информация об изменениях

Сообщение Re[7]: Вопрос знатокам от 04.04.2023 22:11

Изменено 04.04.2023 22:35 rg45

Re[7]: Вопрос знатокам
Здравствуйте, kov_serg, Вы писали:

R>>Чтоб портянки не писать проектировать нужно нормально, по максимуму используя ADL. По-моему, только ленивый еще не писал "не специализируйте шаблоны функций".


_>Без примера не понятно.


http://coliru.stacked-crooked.com/a/4b8d981c3e71c47b

#include <iostream>
#include <string>

template <typename T>
void fi(T&& t)
{
    f(t); // вообще никакого предварительного объявления не требуется
}

namespace test
{
// тип может располагаться даже в произвольном пространстве имен
struct A
{
    std::string name;
};

void f(const A& a)
{
   std::cout << "A: " << a.name << std::endl;
}

} // namespace test

int main()
{
    fi(test::A{"RSDN"});
}


Сразу оговорюсь, что для встроенных типов ADL таким образом не работает. Но я сильно сомневаюсь, что упомянутые выше "портянки" появляются исключительно от использования встроенных типов.
Re[7]: Вопрос знатокам
Здравствуйте, kov_serg, Вы писали:

R>>Чтоб портянки не писать проектировать нужно нормально, по максимуму используя ADL. По-моему, только ленивый еще не писал "не специализируйте шаблоны функций".


_>Без примера не понятно.


http://coliru.stacked-crooked.com/a/4b8d981c3e71c47b

#include <iostream>
#include <string>

template <typename T>
void fi(T&& t)
{
    f(t); // вообще никакого предварительного объявления не требуется
}

namespace test
{
// А типы вместе с их функциями могут располагаться в разных пространствах имен
struct A
{
    std::string name;
};

void f(const A& a)
{
   std::cout << "A: " << a.name << std::endl;
}

} // namespace test

int main()
{
    fi(test::A{"RSDN"});
}


Сразу оговорюсь, что для встроенных типов ADL таким образом не работает. Но я сильно сомневаюсь, что упомянутые выше "портянки" появляются исключительно от использования встроенных типов.