Portál AbcLinuxu, 30. dubna 2025 09:10
Tiskni
Sdílej:
explicit operator bool()
. Implicitní operator bool()
lze použít pro převod na číselné typy, což je náchylné na chyby: coroutine<void()> a = …; coroutine<void()> b = …; a + b;(Keyword: safebool) Pomocné metody typu
swap
je lepší uvádět jako friend void swap(type &a, type &b) { … }
uvnitř tříd. Řeší to některé problémy s nutností hledat správný namespace a udržuje kód u toho, k čemu to patří. Při volání se pak místo void do_swap() { std::swap(a, b); ostd::swap(c, d); ostd::foo::swap(e, f); // Nebo to bylo ostd::bar::swap? }použije
void do_swap() { using std::swap; swap(a, b); swap(c, d); // friend třídy instancí c a d, nepotřebuje namespace swap(e, f); }(Keyword: argument-dependent lookup) Místo
type(type const&) = delete; type(type &&) = default; type& operator =(type const&) = delete; type& operator =(type &&) = default;doporučuji použít
noncopyable
á la Boost. Je to přehlednější a lépe se to používá v šablonovém metaprogramování.
Jinak moc pěkný kód *thumbs up*
swap(a, b)
místo a.swap(b)
: to první funguje v šablonách, kde nemusím řešit, jestli ten typ má metodu swap
nebo používá std::swap
.
std::swap(foo::bar::T{}, foo::bar::T{})
první vyzkouší foo::bar::swap(a, b)
a pak použije standardní obecný fallback. OctaSTD deklaruje jak vnitřní swap metody, tak samostatné funkce, stejně jako všechny standardní containery, takže je možné na nich použít jak x.swap(b)
, tak std::swap(a, b)
. Ty volné swap funkce jsou většinou deklarované hned po tom containeru, jako inline void swap(mytype &a, mytype &b) { a.swap(b); }
.
Ohledně toho explicitního boolu, záměrem je samozřejmě použít explicitní. Momentální použití implicitního je bug...
ontop_fcontext
)... nicméně ten asm mám stejně pro všechny podporované platformy, tak je to celkem jedno.
Jinak jsem zrovna implementoval lepší stack allocator, takže by ta implementace v ostd měla být teď víceméně kompletní s relativně ideálním výkonem (jen momentálně nepodporuje rostoucí segmented stacky, ale to možná jindy...)
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.