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

Сообщение Re[10]: Вопрос знатокам от 05.04.2023 11:55

Изменено 05.04.2023 12:48 rg45

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

_>C++ extension functions

_>
_>struct A {
_>  template<class... T> A& f(T&...t) { void ext_f(A*,T&...); ext_f(this,t...); return *this; }
_>};
_>

_>Всё таки C++ наркоманский язык.

А объявление ext_f нафига здесь — чтоб код труднее читать было и чтоб ADL поломать?

http://coliru.stacked-crooked.com/a/7aa93214da386f99

#include <iostream>

struct A {

    template<class... T>
    A& f(T&&...t) { 
        ext_f(*this, t...);
        return *this;
    }
};

void ext_f(A&, int i)
{
    std::cout << "ext_f(A&, " << i << ")" << std::endl;
}

template <typename...T>
void ext_f(A&, T&&...t)
{
    ((std::cout << t << " "), ...);
}

int main()
{
    A a;
    a.f(42); // -> ext_f(A&, 42);
    a.f("Hello", 3.14, 'A'); // -> Hello 3.14 A
}
Re[10]: Вопрос знатокам
Здравствуйте, kov_serg, Вы писали:

_>C++ extension functions

_>
_>struct A {
_>  template<class... T> A& f(T&...t) { void ext_f(A*,T&...); ext_f(this,t...); return *this; }
_>};
_>

_>Всё таки C++ наркоманский язык.

А объявление ext_f нафига здесь — чтоб код труднее читать было и чтоб ADL поломать?

http://coliru.stacked-crooked.com/a/7aa93214da386f99

#include <iostream>

struct A {

    template<class... T>
    A& f(T&&...t) { 
        ext_f(*this, t...);
        return *this;
    }
};

void ext_f(A&, int i)
{
    std::cout << "ext_f(A&, " << i << ")" << std::endl;
}

template <typename...T>
void ext_f(A&, T&&...t)
{
    ((std::cout << t << " "), ...);
}

int main()
{
    A a;
    a.f(42); // -> ext_f(A&, 42);
    a.f("Hello", 3.14, 'A'); // -> Hello 3.14 A
}


P.S. Обрати внимание, я специально подобрал два таких варианта исполнения ext_f, которые не укладываются в одно общее объявление. Тем не менее, оба эти варианта спокойно подхватываются внутри A::f.