Сообщение Re[10]: Вопрос знатокам от 05.04.2023 11:55
Изменено 05.04.2023 12:48 rg45
Re[10]: Вопрос знатокам
Здравствуйте, kov_serg, Вы писали:
_>C++ extension functions
_>
_>Всё таки C++ наркоманский язык.
А объявление ext_f нафига здесь — чтоб код труднее читать было и чтоб ADL поломать?
http://coliru.stacked-crooked.com/a/7aa93214da386f99
_>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
_>
_>Всё таки C++ наркоманский язык.
А объявление ext_f нафига здесь — чтоб код труднее читать было и чтоб ADL поломать?
http://coliru.stacked-crooked.com/a/7aa93214da386f99
P.S. Обрати внимание, я специально подобрал два таких варианта исполнения ext_f, которые не укладываются в одно общее объявление. Тем не менее, оба эти варианта спокойно подхватываются внутри A::f.
_>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.