
ุงูู
ูุงููู
ุงูุชู ุชุธูุฑ ูู C ++ 20 ูู ู
ูุถูุน ุทููู ูู
ูุงูุด ุนูู ูุทุงู ูุงุณุน. ุนูู ุงูุฑุบู
ู
ู ูุงุฆุถ ุงูู
ูุงุฏ ุงูู
ุชุฑุงูู
ุฉ ุนูู ู
ุฑ ุงูุณููู (ุจู
ุง ูู ุฐูู ุฎุทุจ ุงูุฎุจุฑุงุก ู
ู ุงูุทุฑุงุฒ ุงูุนุงูู
ู) ุ ูุง ูุฒุงู ููุงู ุฎูุท ุจูู ุงูู
ุจุฑู
ุฌูู ุงูุชุทุจููููู (ุงูุฐูู ูุง ููุงู
ูู ููู
ููุง ู
ุน ุงูู
ุนูุงุฑ) ู
ุง ูู ู
ูุงููู
C ++ 20 ูู
ุง ูู ูุญุชุงุฌ ุฅุฐุง ูุงู ููุงู enable_if ู
ุญุฏุฏูุง ุนูู ู
ุฑ ุงูุณููู. ููู
ู ุงูุฎุทุฃ ุฌุฒุฆููุง ูู ููููุฉ ุชุทูุฑ ุงูู
ูุงููู
ุนูู ู
ุฏุงุฑ 15 ุนุงู
ูุง ุชูุฑูุจูุง (Concepts Full + Concept Map -> Concepts Lite) ุ ููุฑุฌุน ุฐูู ุฌุฒุฆููุง ุฅูู ุฃู ุงูู
ูุงููู
ุงุชุถุญ ุฃููุง ุชุฎุชูู ุนู ุงูุฃุฏูุงุช ุงูู
ู
ุงุซูุฉ ูู ูุบุงุช ุฃุฎุฑู (Java / C # bounds generounds ุ Rust Rust ุ. ..).
ุชุญุช ู
ูุทุน ุงูููุฏูู ููุณุฎุฉ ูุชูุฑูุฑ ุฃุนุฏู ุฃูุฏุฑูู ุฏุงููุฏูู ู
ู ูุฑูู ReSharper C ++ ู
ู ู
ุคุชู
ุฑ C ++ Russia 2019 . ูุงู
ุฃูุฏุฑู ุจู
ุฑุงุฌุนุฉ ู
ุฎุชุตุฑุฉ ููุงุจุชูุงุฑุงุช ุงูู
ุชุนููุฉ ุจู
ูููู
C ++ 20 ุ ูุจุนุฏ ุฐูู ุฏุฑุณ ุชูููุฐ ุจุนุถ ูุฆุงุช ููุธุงุฆู STL ุ ู
ูุงุฑูุฉ ุจูู C ++ 17 ู C ++ 20. ูุฐูู ุงููุตุฉ ูู ููุงุจุฉ ุนูู.
ูุชุญุฏุซ ุนู ุงูู
ูุงููู
. ูุฐุง ู
ูุถูุน ู
ุนูุฏ ูุดุงู
ู ุฅูู ุญุฏ ู
ุง ุ ูุฐูู ุนูุฏ ุงูุฅุนุฏุงุฏ ููุชูุฑูุฑ ุ ููุช ูู ุจุนุถ ุงูุตุนูุจุงุช. ูุฑุฑุช ุฃู ุฃูุชูู ุฅูู ุชุฌุฑุจุฉ ุฃุญุฏ ุฃูุถู ุงูู
ุชุญุฏุซูู ูู ู
ุฌุชู
ุน C ++ Andrei Alexandrescu .
ูู ูููู
ุจุฑ 2018 ุ ุฃุซูุงุก ุญุฏูุซู ูู ุงูุชุชุงุญ ุงูุงุฌุชู
ุงุน C ++ ุ ุณุฃู Andrei ุงูุฌู
ููุฑ ุนู
ุง ุณุชููู ุนููู ุงูู
ูุฒุฉ ุงููุจูุฑุฉ ุงูุชุงููุฉ ูู C ++:
- ุงูู
ูุงููู
- metaclasses
- ุฃู ุงูุชุฃู
ูุ
ููุจุฏุฃ ุจูุฐุง ุงูุณุคุงู. ูู ุชุนุชูุฏ ุฃู ุงูู
ูุฒุฉ ุงููุจูุฑุฉ ุงูุชุงููุฉ ูู C ++ ุณุชููู ู
ูุงููู
ุ
ูููุง ู Alexandrescu ุ ุงูู
ูุงููู
ู
ู
ูุฉ. ูุฐุง ูู ุงูุดูุก ุงูู
ู
ู ุงูุฐู ุฃูุชุฑุญู ุนููู. ุนูุงูุฉ ุนูู ุฐูู ุ ู
ุง ุฒูุช ุบูุฑ ูุงุฏุฑ ุนูู ุงูุญุฏูุซ ุงูู
ุซูุฑ ููุงูุชู
ุงู
ูุงูุญุงุฑ ุนู ุงูู
ุดุงุจู ุ ู
ุซู Herb Sutter ุ ุฃู ุญูู ุงูุชุฃู
ู ุ ู
ุซู Alexandrescu.
ู
ุงุฐุง ูุนูู ุนูุฏู
ุง ูุชุญุฏุซ ุนู ุงูู
ูุงููู
ูู C ++ 20ุ ุชู
ุช ู
ูุงูุดุฉ ูุฐู ุงูู
ูุฒุฉ ู
ูุฐ ุนุงู
2003 ุนูู ุงูุฃูู ุ ูุฎูุงู ูุฐู ุงููุชุฑุฉ ุชู
ููุช ู
ู ุงูุชุทูุฑ ุจุดูู ูุจูุฑ. ุฏุนููุง ูุฑู ู
ุง ูู ุงูุณู
ุงุช ุงูุฌุฏูุฏุฉ ุงูู
ุชุนููุฉ ุจุงูู
ูููู
ุงูุชู ุธูุฑุช ูู ุงูุฅุตุฏุงุฑ C ++ 20.
ูุชู
ุชุนุฑูู ููุงู ุฌุฏูุฏ ูุณู
ู "ุงูู
ูุงููู
" ุจูุงุณุทุฉ ุงูููู
ุฉ ุงูุฃุณุงุณูุฉ concept
. ูุฐุง ูู ุงูู
ุณูุฏ ุนูู ุงูู
ุนูู
ุงุช ูุงูุจ. ูุจุฏู ุดูุก ู
ุซู ูุฐุง:
template <typename T> concept NoThrowDefaultConstructible = noexept(T{}); template <typename From, typename To> concept Assignable = std::is_assignable_v<From, To>
ูู
ุฃุณุชุฎุฏู
ููุท ุงูุนุจุงุฑุฉ "ุนูู ู
ุนูู
ุงุช ุงูููุงูุจ" ุ ูููุณ "ุนูู ุงูุฃููุงุน" ุ ูุฃูู ูู
ูู ุชุนุฑูู ุงูู
ูุงููู
ุนูู ู
ุนูู
ุงุช ุงูููุงูุจ ุบูุฑ ุงูููุงุณูุฉ. ุฅุฐุง ูู
ููู ูุฏูู ุดูุก ุชูุนูู ุนูู ุงูุฅุทูุงู ุ ูู
ููู ุชุญุฏูุฏ ู
ูููู
ููุฑูู
:
template<int I> concept Even = I % 2 == 0;
ูููู ู
ู ุงูู
ูุทูู ุฃู ูุชู
ุฎูุท ู
ุนูู
ุงุช ุงููุงูุจ ุงููู
ูุฐุฌูุฉ ูุบูุฑ ุงูุชูููุฏูุฉ. ูุณู
ู ููุนูุง ุตุบูุฑูุง ุฅุฐุง ูุงู ุญุฌู
ู ูู
ุญุงุฐุงุชู ูุง ูุชุฌุงูุฒุงู ุงูุญุฏูุฏ ุงูู
ุญุฏุฏุฉ:
template<typename T, size_t MaxSize, size_t MaxAlign> concept Small = sizeof(T) <= MaxSize && alignof(T) <= MaxAlign;
ุฑุจู
ุง ุ ูู
ูุชุถุญ ุจุนุฏ ุณุจุจ ุญุงุฌุชูุง ุฅูู ุณูุงุฌ ููุงู ุฌุฏูุฏ ูู ุงููุบุฉ ุ ููู
ุงุฐุง ูุฐุง ุงูู
ูููู
ููุณ ู
ุฌุฑุฏ ู
ุชุบูุฑ constexpr bool
.
ููู ูุชู
ุงุณุชุฎุฏุงู
ุงูู
ูุงููู
ุ
ูููู
ุ ุฏุนููุง ูุฑู ููู ูุชู
ุงุณุชุฎุฏุงู
ุงูู
ูุงููู
.
ุฃููุงู ุ ุชู
ุงู
ูุง ู
ุซู ู
ุชุบูุฑุงุช constexpr bool
ุ ูู
ูู ุงุณุชุฎุฏุงู
ูุง ุฃููู
ุง ููุช ุจุญุงุฌุฉ ุฅูู ุชุนุจูุฑ ู
ูุทูู ูู ููุช ุงูุชุฑุฌู
ุฉ. ุนูู ุณุจูู ุงูู
ุซุงู ุ ุฏุงุฎู static_assert
ุฃู ุฏุงุฎู noexcept
ุงูู
ูุงุตูุงุช:
ุซุงููุงู ุ ูู
ูู ุงุณุชุฎุฏุงู
ุงูู
ูุงููู
ุจุฏูุงู ู
ู ุงูููู
ุงุช ุงูุฃุณุงุณูุฉ class
ุฃู class
ุนูุฏ ุชุญุฏูุฏ ู
ุนูู
ุงุช ุงููุงูุจ. ุญุฏุฏ ูุฆุฉ optional
ุจุณูุทุฉ ู
ู ุดุฃููุง ุจุจุณุงุทุฉ ุชุฎุฒูู ุฒูุฌ ู
ู ุงูุนูุงู
ุฉ ุงูู
ูุทููุฉ ุงูุชู ุชู
ุช initialized
ูุงูููู
. ูุจุทุจูุนุฉ ุงูุญุงู ุ ููุทุจู ูุฐุง optional
ููุท ุนูู ุฃููุงุน ุชุงููุฉ. ูุฐูู ุ ููุชุจ Trivial
ููุง ูุนูุฏู
ุง ูุญุงูู ุฅูุดุงุก ู
ุซูู ู
ู ุดูุก ุบูุฑ ุชุงูู ุ ุนูู ุณุจูู ุงูู
ุซุงู ุ ู
ู std::string
ุ ุณูููู ูุฏููุง ุฎุทุฃ ูู ุงูุชุฑุฌู
ุฉ:
ุงูู
ูุงููู
ูู
ูู ุชุทุจูููุง ุฌุฒุฆูุง. ุนูู ุณุจูู ุงูู
ุซุงู ุ ูุทุจู ูุฆุฉ ูุฏููุง ู
ุน ุงูุฃู
ุซู ุนุงุฒูุฉ ุตุบูุฑุฉ. ูู
ุจุชุนุฑูู ุจููุฉ SB
(ู
ุฎุฒู ู
ุคูุช ุตุบูุฑ) Size
ุซุงุจุช Alignment
ุ ูุณูู ูููู
ุจุชุฎุฒูู ุงูุงุชุญุงุฏ ู
ู SB
ูุงูู
ุคุดุฑ ุนูู ุงูููู
ุฉ. ูุงูุขู ุ ุฅุฐุง ุฌุงุก ููุน ุตุบูุฑ ุฅูู ุงูู
ูุดุฆ ุ ููู
ูููุง ูุถุนู ูู SB
. ูุชุญุฏูุฏ ุฃู ููุนูุง ู
ุง ุตุบูุฑูุง ุ ููุชุจ ุฃูู ููุจู ู
ูููู
Small
. ุงุณุชุบุฑู ู
ูููู
Small
3 ู
ุนูู
ุงุช ุงููุงูุจ: ุญุฏุฏูุง ุงุซููู ุ ูุญุตููุง ุนูู ูุธููุฉ ู
ู ู
ุนูู
ุฉ ูุงูุจ ูุงุญุฏ:
ููุงู ุณุฌู ุฃูุตุฑ. ููุชุจ ุงุณู
ุงูู
ุนูู
ุฉ ูุงูุจ ุ ุฑุจู
ุง ู
ุน ุจุนุถ ุงูุญุฌุฌ ุ ูุจู auto
. ูุชู
ุฅุนุงุฏุฉ ูุชุงุจุฉ ุงูู
ุซุงู ุงูุณุงุจู ุจูุฐู ุงูุทุฑููุฉ:
ุฑุจู
ุง ุ ูู ุฃู ู
ูุงู ููุชุจ ููู auto
ุ ูู
ููู ุงูุขู ูุชุงุจุฉ ุงุณู
ุงูู
ูููู
ุฃู
ุงู
ู.
ุญุฏุฏ ูุธููุฉ get_handle
ุ ูุงูุชู ุชููู
ุจุฅุฑุฌุงุน ุจุนุถ handle
ุงููุงุฆู.
ูุญู ููุชุฑุถ ุฃู ุงูุฃุดูุงุก ุงูุตุบูุฑุฉ ููุณูุง ูุชู
handle
ุ ูุจุงููุณุจุฉ ูููุงุฆูุงุช ุงููุจูุฑุฉ ุ ูุฅู ุงูู
ุคุดุฑ ุฅูููุง ูู handle
. ูุธุฑูุง ูุฃู ูุฏููุง ูุฑุนูู if constexpr
ูุดูุฑ ุฅูู ุชุนุจูุฑุงุช ู
ู ุฃููุงุน ู
ุฎุชููุฉ ุ ูู
ู ุงูู
ุฑูุญ ุจุงููุณุจุฉ ููุง ุนุฏู
ุชุญุฏูุฏ ููุน ูุฐู ุงููุธููุฉ ุจุดูู ุตุฑูุญ ุ ูููู ู
ุทุงูุจุฉ ุงูู
ุชุฑุฌู
ุจุฅุฎุฑุงุฌูุง. ููู ุฅุฐุง ูู
ูุง ุจุจุณุงุทุฉ auto
ุ ูุณูู ูููุฏ ุงูู
ุนููู
ุงุช ุงูุชู ุชููุฏ ุจุฃู ุงูููู
ุฉ ุงูู
ุดุงุฑ ุฅูููุง ุตุบูุฑุฉ ุ ููุง ุชุชุฌุงูุฒ ุงูู
ุคุดุฑ:
ูู C ++ 20 ุ ุณูููู ู
ู ุงูู
ู
ูู ุงููุชุงุจุฉ ูุจู ุฃู ุชููู ููุณุช auto
ููุท ุ ุจู ูู ู
ุญุฏูุฏุฉ auto
:
ูุชุทูุจ ุงูุชุนุจูุฑ
ูุชุทูุจ ุงูุชุนุจูุฑ ุนุจุงุฑุฉ ุนู ุนุงุฆูุฉ ูุงู
ูุฉ ู
ู ุงูุชุนุจูุฑ ุ ููููุง ู
ู ุงูููุน bool
ูุชุญุณุจ ูู ููุช ุงูุชุฑุฌู
ุฉ. ูุชู
ุงุณุชุฎุฏุงู
ูุง ูุงุฎุชุจุงุฑ ุนุจุงุฑุงุช ุญูู ุงูุชุนุจูุฑุงุช ูุงูุฃููุงุน. ูุชุทูุจ ุงูุชุนุจูุฑ ู
ููุฏูุง ุฌุฏูุง ูุชุญุฏูุฏ ุงูู
ูุงููู
.
ู
ุซุงู Constructible
. ุฃููุฆู ุงูุฐูู ูุงููุง ูู ุชูุฑูุฑู ุงูุณุงุจู ุฑุฃูู ุจุงููุนู:
template<typename T, typename... Args> concept Constructible = requires(Args... args) { T{args...} };
ูู
ุซุงู ู
ุน Comparable
. ุฏุนูุง ูููู ุฃู ุงูููุน T
ูุงุจู Comparable
ุฅุฐุง ูุงู ูู
ูู Comparable
ูุงุฆููู ู
ู ุงูููุน T
ุจุงุณุชุฎุฏุงู
ุนุงู
ู ุงูุชุดุบูู "ุงูุฃูู" ููุชู
ุชุญููู ุงููุชูุฌุฉ ุฅูู bool
. ูุฐุง ุงูุณูู
ูุงูููุน ุจุนุฏู ูุนูู ุฃู ุชุนุจูุฑ ุงููุชุงุจุฉ ูุชู
ุชุญูููู ุฅูู bool
ุ ูููุณ ู
ุณุงููุงู ูู bool
:
template<typename T> concept Comparable = requires(T const & a, T const & b) { {a < b} -> bool; };
ู
ุง ุฏุฑุณูุงู ุจุงููุนู ูุงูู ูุฅุธูุงุฑ ู
ุซุงู ูุงู
ู ูุงุณุชุฎุฏุงู
ุงูู
ูุงููู
.
ูุฏููุง ุจุงููุนู ู
ูููู
ูุงุจู Comparable
ุ ุฏุนููุง ูุญุฏุฏ ู
ูุงููู
ุงูุชูุฑุงุฑุงุช. ุฏุนูุง ูููู RandomAccessIterator
ูู RandomAccessIterator
ูุจุนุถ ุงูุฎุตุงุฆุต ุงูุฃุฎุฑู. ู
ุน ูุฐุง ุ ูุญุฏุฏ ู
ูููู
Sortable
. ูุณู
ู Range
RandomAccess
ุฅุฐุง ูุงู ูู
ูู ู
ูุงุฑูุฉ ู
ูุฑุฑ RandomAccess
ูุนูุงุตุฑู. ูุงูุขู ูู
ูููุง ูุชุงุจุฉ ูุธููุฉ sort
ูุง ุชูุจู ุฐูู ูุญุณุจ ุ ูููู ูู
ูู Sortable Range
:
ุงูุขู ุ ุฅุฐุง ุญุงูููุง ุงุณุชุฏุนุงุก ูุฐู ุงููุธููุฉ ู
ู ุดูุก ูุง ููู ุจู
ูููู
Sortable ุ ูุณูุญุตู ุนูู ุฎุทุฃ ุฌูุฏ ูุตุฏูู ูู SFINAE ู
ู ุงูู
ุชุฑุฌู
ุจุฑุณุงูุฉ ูุงุถุญุฉ. ุฏุนูุง ูุญุงูู ุฅูุดุงุก ู
ุซูู std::list
'ุฃู ู
ุชุฌู ุงูุนูุงุตุฑ ุงูุชู ูุง ูู
ูู ู
ูุงุฑูุชูุง:
ูู ุณุจู ูู ุฃู ุฑุฃูุช ู
ุซุงููุง ู
ุดุงุจููุง ูุงุณุชุฎุฏุงู
ุงูู
ูุงููู
ุฃู ุดูุก ู
ุดุงุจู ุฌุฏูุงุ ููุฏ ุฑุฃูุช ูุฐุง ุนุฏุฉ ู
ุฑุงุช. ุจุตุฑุงุญุฉ ุ ูู
ุชููุนูู ุนูู ุงูุฅุทูุงู. ูู ูุญู ุจุญุงุฌุฉ ุฅูู ุณูุงุฌ ุงูุนุฏูุฏ ู
ู ุงูููุงูุงุช ุงูุฌุฏูุฏุฉ ูู ุงููุบุฉ ุ ุฅุฐุง ุงุณุชุทุนูุง ุงูุญุตูู ุนูููุง ูู C ++ 17ุ
ููุฏ ุฃุฏุฎูุช concept
ุงูููู
ุงุช ุงูุฑุฆูุณูุฉ concept
ู
ุงูุฑู ุ Comparable
ุฅุนุงุฏุฉ ูุชุงุจุฉ Comparable
ุจูุฐู ุงูุทุฑููุฉ. ููุฏ ุฃุตุจุญ ุฃูุจุญ ููููุงู ุ ููุฐุง ุชูู
ูุญุงุช ููุง ุงูุชู ุชุชุทูุจ ุงูุชุนุจูุฑ ูู ุญููุง ุดูุก ู
ููุฏ ูู
ูุงุฆู
. ูุฐูู ุญุฏุฏูุง ู
ูููู
enable_if
ูุจุงุณุชุฎุฏุงู
enable_if
ุฅูู ุฃู ุฏุงูุฉ sort
ุชูุจู Sortable Range
.
ูุฏ ุชุนุชูุฏ ุฃู ูุฐู ุงูุทุฑููุฉ ุชููุฏ ุงููุซูุฑ ููููุง ูุฑุณุงุฆู ุฎุทุฃ ุงูุชุญููู ุงูุจุฑู
ุฌู ุ ูููู ุ ูู ุงููุงูุน ุ ูุฐู ู
ุณุฃูุฉ ุฌูุฏุฉ ุชุทุจูู ุจุฑูุงู
ุฌ ุงูุชุญููู ุงูุจุฑู
ุฌู. ุฏุนูุง ูููู ุฃู enable_if
ุถุฌุฉ ุญูู ูุฐุง ุงูู
ูุถูุน ุ enable_if
ุชุญุฏูุฏูุง ุฃูู ุฅุฐุง ุงุณุชุจุฏูุช enable_if
ุงูุญุฌุฉ ุงูุฃููู
ุฅุฐุง false
ุญุณุงุจ false
ุ ุซู
ููุฏู
ูู ูุฐุง ุงูุฎุทุฃ ุจุญูุซ ูู
ูุชู
ุงูููุงุก ุจูุฐุง ุงูุดุฑุท.
ุงูู
ุซุงู ุฃุนูุงู ูุจุฏู ุฃูู ู
ูุชูุจ ู
ู ุฎูุงู ุงูู
ูุงููู
. ูุฏู ูุฑุถูุฉ: ูุฐุง ุงูู
ุซุงู ุบูุฑ ุญุงุณู
ุ ูุฃูู ูุง ูุณุชุฎุฏู
ุงูู
ูุฒุฉ ุงูุฑุฆูุณูุฉ ููู
ูุงููู
- ูุชุทูุจ ููุฑุฉ.
ูุชุทูุจ ุฌู
ูุฉ
ูุชุทูุจ ุฌู
ูุฉ ู
ุซู ูุฐุง ุงูุดูุก ุงูุฐู ูุฎูู
ุชูุฑูุจุง ุฃู ุฅุนูุงู ูุงูุจ ุฃู ูุธููุฉ ุบูุฑ ูุงูุจ. ุจุดูู Syntactically ุ ูุจุฏู ุฃู ูุฐุง requires
ุงูููู
ุฉ ุงูุฃุณุงุณูุฉ ุ ู
ุชุจูุนุฉ ุจุจุนุถ ุชุนุจูุฑ Boolean. ูุนุฏ ุฐูู ุถุฑูุฑููุง ูุชุตููุฉ ุชุฎุตุต ุงููุงูุจ ุฃู ู
ุฑุดุญ ุงูุชุญู
ูู ุงูุฒุงุฆุฏ ุ ุฃู ุฃูู ูุนู
ู ุจููุณ ุทุฑููุฉ ุนู
ู SFINAE ุ ููุชู
ููุท ุจุดูู ุตุญูุญ ุ ูููุณ ุนู ุทุฑูู ุงูุงุฎุชุฑุงูุงุช:
ุญูุซ ูู ู
ุซุงููุง ุงูู
ุตูู ูู
ูู ุฃู ูุณุชุฎุฏู
ู ูุชุทูุจ ุฌู
ูุฉุ ุจุฏูุงู ู
ู ุจูุงุก ุฌู
ูุฉ ู
ุฎุชุตุฑ ูุชุทุจูู ุงูู
ูุงููู
ุ ููุชุจ ูุฐุง:
template<typename R> concept Sortable = RandomAccessIterator<Iterator<R>> && Comparable<ValueType<R>>; template<typename Range> requires Sortable<Range> void sort(Range &) { ... }
ูุจุฏู ุฃู ุงูููุฏ ุฃุตุจุญ ุฃุณูุฃ ูุฃูุจุฑ. ูููู ุงูุขู ูู
ูููุง ุงูุชุฎูุต ู
ู ู
ูููู
Sortable
. ู
ู ูุฌูุฉ ูุธุฑู ุ ูุนุฏ ูุฐุง ุชุญุณูููุง ุ ูุฃู ู
ูููู
Sortable
ู
ูููู
tautological: ูุญู ูุณู
ู Sortable
ูู ุดูุก ูู
ูู ูููู ุฅูู ูุธููุฉ sort
. ูุฐุง ููุณ ูู ู
ุนูู ู
ุงุฏู. ูุนูุฏ ูุชุงุจุฉ ุงูููุฏ ุจูุฐู ุงูุทุฑููุฉ:
//template<typename R> concept Sortable // = RandomAccessIterator<Iterator<R>> && Comparable<ValueType<R>>; template<typename Range> requires RandomAccessIterator<Iterator<Range>> && Comparable<ValueType<Range>>; void sort(Range &) { ... }
ุชุจุฏู ูุงุฆู
ุฉ ุงูุงุจุชูุงุฑุงุช ุงูู
ุชุนููุฉ ุจุงูู
ูููู
ูู C ++ 20 ููุฐุง. ูุชู
ูุฑุฒ ุงูุนูุงุตุฑ ุงูู
ูุฌูุฏุฉ ูู ูุฐู ุงููุงุฆู
ุฉ ุนู ุทุฑูู ุฒูุงุฏุฉ ูุงุฆุฏุฉ ุงูู
ูุฒุฉ ู
ู ูุฌูุฉ ูุธุฑู ุงูุดุฎุตูุฉ:
concept
ููุงู ุฌุฏูุฏ. ูุจุฏู ูู ุฃูู ุณูููู ู
ู ุงูู
ู
ูู ุงูุงุณุชุบูุงุก ุนู ุฌููุฑ concept
ุนู ุทุฑูู ู
ูุญ ู
ุชุบูุฑุงุช constexpr bool
ู
ุน ุฏูุงูุงุช ุฅุถุงููุฉ.- ุจูุงุก ุฌู
ูุฉ ุฎุงุต ูุชุทุจูู ุงูู
ูุงููู
. ุจุงูุทุจุน ุ ุฅูู ู
ู
ุชุน ุ ููู ูุฐุง ู
ุฌุฑุฏ ุจูุงุก ุฌู
ูุฉ. ุฅุฐุง ูุงู ู
ุจุฑู
ุฌู C ++ ูุฎุดูู ุจูุงุก ุงูุฌู
ูุฉ ุงูุณูุฆ ุ ููุงููุง ูุฏ ู
ุงุชูุง ุฎูููุง ู
ูุฐ ูุชุฑุฉ ุทูููุฉ.
- ูุชุทูุจ ุงูุชุนุจูุฑ ุชุนุจูุฑูุง ุฑุงุฆุนูุง ุ ููู ู
ููุฏ ููุณ ููุท ูุชุญุฏูุฏ ุงูู
ูุงููู
.
- ุชุชุทูุจ ุฌู
ูุฉ ูู ุฃูุจุฑ ููู
ุฉ ููู
ูุงููู
ุ ููู ุชุชูุญ ูู ูุณูุงู SFINAE ูุบูุฑูุง ู
ู ุงูุฃููุงู ุงูุฃุณุทูุฑูุฉ ูููุงูุจ C ++.
ุฃูุซุฑ ุนูู ูุชุทูุจ ุงูุชุนุจูุฑ
ูุจู ุงูุฏุฎูู ูู ู
ูุงูุดุฉ ูุชุทูุจ ุฌู
ูุฉ ุ ุจุถุน ููู
ุงุช ุญูู ูุชุทูุจ ุงูุชุนุจูุฑ.
ุฃููุงู ุ ูู
ูู ุงุณุชุฎุฏุงู
ูุง ููุณ ููุท ูุชุญุฏูุฏ ุงูู
ูุงููู
. ู
ูุฐ ุฒู
ู ุณุญูู ุ ูุญุชูู ุจุฑูุงู
ุฌ ุงูุชุญููู ุงูุจุฑู
ุฌู ูู Microsoft ุนูู ู
ูุญู __if_exists
- __if_not_exists
. ููู ูุชูุญ ููุช ุงูุชุฑุฌู
ุฉ ููุชุญูู ู
ู ูุฌูุฏ ุงุณู
ุ ูุจูุงุกู ุนูู ุฐูู ุ ูู
ุจุชู
ููู ุฃู ุชุนุทูู ุชุฌู
ูุน ูุชูุฉ ุงูุชุนููู
ุงุช ุงูุจุฑู
ุฌูุฉ. ููู ูุงุนุฏุฉ ุงูุดูุฑุงุช ุ ุงูุชู ุนู
ูุช ุจูุง ู
ูุฐ ุนุฏุฉ ุณููุงุช ุ ูุงู ุงูุฃู
ุฑ ู
ุซู ูุฐุง. ููุงู ุฏุงูุฉ f()
ุ ุชุฃุฎุฐ ููุทุฉ ู
ู ููุน ุงููุงูุจ ูุชุณุชุบุฑู ุงูุงุฑุชูุงุน ู
ู ูุฐู ุงูููุทุฉ. ูู
ูู ุฅูุดุงุก ู
ุซูู ูู ุจููุทุฉ ุซูุงุซูุฉ ุงูุฃุจุนุงุฏ ุฃู ุซูุงุฆูุฉ ุงูุฃุจุนุงุฏ. ุจุงููุณุจุฉ ููุซูุงุซู ุงูุฃุจุนุงุฏ ุ ูุฅููุง ูุนุชุจุฑ ุฃู ุงูุฅุญุฏุงุซู z
ูู ุงูุงุฑุชูุงุน ุ ุฃู
ุง ุจุงููุณุจุฉ ููุซูุงุฆู ุงูุฃุจุนุงุฏ ุ ูุฅููุง ููุชูู ุฅูู ู
ุณุชุดุนุฑ ุฎุงุต ููุณุทุญ. ูุจุฏู ู
ุซู ูุฐุง:
struct Point2 { float x, y; }; struct Point3 { float x, y, z; }; template<typename Point> void f(Point const & p) { float h; __if_exists(Point::z) { h = pz; } __if_not_exists(Point::z) { h = sensor.get_height(p); } }
ูู C ++ 20 ุ ูู
ูููุง ุฅุนุงุฏุฉ ูุชุงุจุฉ ูุฐุง ุฏูู ุงุณุชุฎุฏุงู
ู
ูุญูุงุช ุจุฑูุงู
ุฌ ุงูุชุญููู ุงูุจุฑู
ุฌู ุจุงุณุชุฎุฏุงู
ุงูุชุนููู
ุงุช ุงูุจุฑู
ุฌูุฉ ุงูููุงุณูุฉ. ูุจุฏู ูู ุฃูู ูู
ูุนุฏ ุฃุณูุฃ:
struct Point2 { float x, y; }; struct Point3 { float x, y, z; }; template<typename Point> void f(Point const & p) { float h; if constexpr(requires { Point::z; }) h = pz; else h = sensor.get_height(p); }
ุงูููุทุฉ ุงูุซุงููุฉ ูู ุฃูู ุจุญุงุฌุฉ ุฅูู ุชูุฎู ุงูุญุฐุฑ ู
ู ุจูุงุก ุงูุฌู
ูุฉ ูุชุทูุจ ุงูุชุนุจูุฑ.
ุฅููุง ูููุฉ ุฌุฏูุง ุ ููุชู
ุชุญููู ูุฐู ุงูููุฉ ู
ู ุฎูุงู ุฅุฏุฎุงู ุงูุนุฏูุฏ ู
ู ุงูุฅูุดุงุกุงุช ุงููุญููุฉ ุงูุฌุฏูุฏุฉ. ูู
ููู ุงูุญุตูู ุนูู ุงูุฎูุท ุจูููู
ุง ุ ุนูู ุงูุฃูู ูู ุงูุจุฏุงูุฉ.
ุฏุนูุง ูุนุฑูู ู
ูููู
Sizable
ุงูุฐู ูุชุญูู ู
ู ุฃู ุงูุญุงููุฉ ููุง size
ุทุฑููุฉ ุซุงุจุช ููุฑุฌุน size_t
. ู
ู ุงูุทุจูุนู ุฃู ูุชููุน ุฃู ูููู vector<int>
ุ ูู
ุน ุฐูู static_assert
ูุฐุง static_assert
. ูู ุชููู
ูู
ุงุฐุง ูุฏููุง ุฎุทุฃุ ูู
ุงุฐุง ูุง ูุชู
ุชุฌู
ูุน ูุฐุง ุงูุฑู
ุฒุ
template<typename Container> concept Sizable = requires(Container const & c) { c.size() -> size_t; }; static_assert(Sizable<vector<int>>);
ุงุณู
ุญูุง ูู ุฃู ุฃุฑูู ุงูุฑู
ุฒ ุงูุฐู ูุฌู
ุน. ูุฆุฉ X
ูุฐู ุชุฑุถู ู
ูููู
Sizable
. ุงูุขู ุฃูุช ุชููู
ู
ุง ูุฏููุง ู
ุดููุฉุ
struct X { struct Inner { int size_t; }; Inner* size() const; }; static_assert(Sizable<X>);
ุงุณู
ุญูุง ูู ุฃู ุฅุตูุงุญ ุฑู
ุฒ ุชุณููุท ุงูุถูุก. ุนูู ุงููุณุงุฑ ุ ุงูุฑู
ุฒ ู
ููู ูู
ุง ุฃุฑูุฏ. ูููู ูู ุงููุงูุน ุ ูุฌุจ ุฃู ูุชู
ุฑุณู
ูุง ุนูู ุงููู
ูู:

ุงูุธุฑ ุ ููู size_t
ุ ููู ุจุนุฏ ุงูุณูู
ุ ูุฏ ุชุบูุฑุ ููุช ุฃุฑุบุจ ูู ุฃู ูููู ููุนูุง ู
ุง ุ ูููู ู
ุฌุฑุฏ ู
ุฌุงู ูุตู ุฅููู. ูู ู
ุง ูุฏููุง ูุชุทูุจ ุงูุชุนุจูุฑ ูู ุชุนุจูุฑ ูุงุญุฏ ูุจูุฑ ุ ููุญู ูุชุญูู ู
ู ุตุญุชู. ุจุงููุณุจุฉ ููููุน X
ุ ูุนู
ุ ูุฐุง ุชุนุจูุฑ ุตุญูุญ ุ ุจุงููุณุจุฉ vector<int>
ุ ูุง. ูุชุญููู ู
ุง ููุง ูุฑูุฏ ุ ูุญุชุงุฌ ุฅูู ุฃุฎุฐ ุงูุชุนุจูุฑ ูู ุงูุฃููุงุณ:
template<typename Container> concept Sizable = requires(Container const & c) { {c.size()} -> size_t; }; static_assert(Sizable<vector<int>>);
ูููู ูุฐุง ู
ุฌุฑุฏ ู
ุซุงู ู
ู
ุชุน. ุจุดูู ุนุงู
ุ ุชุญุชุงุฌ ููุท ุฅูู ุชูุฎู ุงูุญุฐุฑ.
ุฃู
ุซูุฉ ุนูู ุงุณุชุฎุฏุงู
ุงูู
ูุงููู
ุชูููุฐ ูุฆุฉ ุงูุฒูุฌ
ุนูุงูุฉ ุนูู ุฐูู ุ ุณุฃุนุฑุถ ุจุนุถ ุฃุฌุฒุงุก STL ุงูุชู ูู
ูู ุชูููุฐูุง ูู C ++ 17 ุ ูููู ู
ุฑููุฉ ุฅูู ุญุฏ ู
ุง.
ุซู
ุณูุฑู ููู ูู
ูููุง ุชุญุณูู ุงูุชุทุจูู ูู C ++ 20.
ููุจุฏุฃ ู
ุน ุงูุทุจูุฉ pair
.
ูุฐู ูุฆุฉ ูุฏูู
ุฉ ุฌุฏูุง ุ ููู ูุง ุชุฒุงู ูู ุงูุฅุตุฏุงุฑ C ++ 98.
ูุง ูุญุชูู ุนูู ุฃู ู
ูุทู ู
ุนูุฏ ุ ูุฐูู
ุฃูุฏ ุชุนุฑููู ูุชุจุฏู ุดูุก ู
ู ูุฐุง ุงููุจูู.
ู
ู ูุฌูุฉ ูุธุฑู ุ ูุฌุจ ุฃู ููุชูู ุชูุฑูุจูุง ุจูุฐุง:
template<typename F, typename S> struct pair { F f; S s; ... };
ูููู ุ ููููุง cppreference ุ ููุฌุฏ ูุฏู pair
ุงูู
ุตู
ู
ูู 8 ูุทุน ููุท.
ูุฅุฐุง ูุธุฑุช ุฅูู ุงูุชุทุจูู ุงูุญูููู ุ ุนูู ุณุจูู ุงูู
ุซุงู ุ ูู Microsoft STL ุ ุณูููู ููุงู ู
ุง ูุตู ุฅูู 15 pair
ูููุฆุฉ pair
. ูู ููุธุฑ ุฅูู ูู ูุฐู ุงูููุฉ ูููุชุตุฑ ุนูู ุงูู
ููุดุฆ ุงูุงูุชุฑุงุถู.
ูุจุฏู ุฃูู ุดูุก ู
ุนูุฏุ ุจุงุฏุฆ ุฐู ุจุฏุก ุ ูุญู ูููู
ุณุจุจ ุงูุญุงุฌุฉ ุฅูููุง. ูุฑูุฏ ุฅุฐุง ูุงูุช ุฅุญุฏู ูุณุงุฆุท ูุฆุฉ pair
ู
ู ููุน ุชุงูู ุ ุนูู ุณุจูู ุงูู
ุซุงู int
ุ ุซู
ุจุนุฏ ุชูููู ูุฆุฉ pair
ุชู
ุชููุฆุชูุง ุฅูู ุงูุตูุฑ ุ ููู
ุชุธู ุบูุฑ ู
ููุฃุฉ. ููููุงู
ุจุฐูู ุ ูุฑูุฏ ูุชุงุจุฉ ู
ููุดุฆ ูุณุชุฏุนู ุชููุฆุฉ ุงูููู
ุฉ ููุญููู f
(ุฃููุงู) ู s
(ุงูุซุงููุฉ).
template<typename F, typename S> struct pair { F f; S s; pair() : f() , s() {} };
ูุณูุก ุงูุญุธ ุ ุฅุฐุง ุญุงูููุง ุฅูุดุงุก ู
ุซูู pair
ู
ู ุดูุก ูุง ูุญุชูู ุนูู ู
ููุดุฆ ุงูุชุฑุงุถู ุ ุนูู ุณุจูู ุงูู
ุซุงู ุ ู
ู ู
ุซู ูุฐู ุงููุฆุฉ
ุ ูุณูู ูุชููู ุฎุทุฃู ูู ุงูุชุฑุฌู
ุฉ ุนูู ุงูููุฑ. ูุชู
ุซู ุงูุณููู ุงูู
ุฑุบูุจ ูู ุฃูู ุฅุฐุง ุญุงููุช ุฅูุดุงุก pair
ุ ูุณูููู ุงูุฎุทุฃ ุงูุงูุชุฑุงุถู ุฎุทุฃ ูู ุงูุชุฑุฌู
ุฉ ุ ูููู ุฅุฐุง ู
ุฑุฑูุง ุตุฑุงุญุฉู ููู
f
ู s
ุ ูุณูุนู
ู ูู ุดูุก:
struct A { A(int); }; pair<int, A> a2;
ููููุงู
ุจุฐูู ุ ุงุฌุนู ุงูู
ููุดุฆ ุงูุงูุชุฑุงุถู ูุงูุจูุง ูุญุตุฑู ูู SFINAE.
ุงูููุฑุฉ ุงูุฃููู ุงูุชู ุชุชุจุงุฏุฑ ุฅูู ุงูุฐูู ูู ุฏุนูุง ููุชุจ ุจุญูุซ ูุง ููุณู
ุญ ุจูุฐุง ุงูู
ูุดุฆ ุฅูุง ุฅุฐุง ูุงูุช f
ู s
ุบูุฑ ูุงุจูุฉ is_default_constructable
:
template<typename F, typename S> struct pair { F f; S s; template<typename = enable_if_t<conjunction_v< is_default_constructible<F>,
ูู ููุฌุญ ูุฐุง ุ ูุฃู ุงููุณุงุฆุท enable_if_t
ุชุนุชู
ุฏ ููุท ุนูู ู
ุนูู
ุงุช ูุงูุจ ุงููุฆุฉ. ุฃู ุจุนุฏ ุงุณุชุจุฏุงู ุงููุตู ุ ูุตุจุญูู ู
ุณุชูููู ุ ููู
ูู ุญุณุงุจูู
ุนูู ุงูููุฑ. ูููู ุฅุฐุง ุญุตููุง ุนูู false
ุ ุนูู ุงูุชูุงูู ุ ููุฏ ุญุตููุง ู
ุฑุฉ ุฃุฎุฑู ุนูู ุฎุทุฃ ุจุฑูุงู
ุฌ ุงูุชุญููู ุงูุจุฑู
ุฌู ุงูุซุงุจุช.
ููุชุบูุจ ุนูู ุฐูู ุ ุฏุนูุง ูุถูู ุงูู
ุฒูุฏ ู
ู ู
ุนูู
ุงุช ุงููุงูุจ ุฅูู ูุฐุง ุงูู
ููุดุฆ ููุฌุนู ุงูุดุฑุท enable_if_t
ูุนุชู
ุฏ ุนูู ู
ุนูู
ุงุช ุงูููุงูุจ ูุฐู:
template<typename F, typename S> struct pair { F f; S s; template<typename T = F, typename U = S, typename = enable_if_t<conjunction_v< is_default_constructible<T>, is_default_constructible<U> >>> pair() : f(), s() {} };
ุงููุถุน ู
ุถุญู ุฌุฏุง. ูุงูุญูููุฉ ูู ุฃู ุงูู
ุนูู
ุงุช ุงููุงูุจ T
ู U
ูุง ูู
ูู ุชุนููููุง ุจุดูู ุตุฑูุญ ู
ู ูุจู ุงูู
ุณุชุฎุฏู
. ูู C ++ ุ ูุง ููุฌุฏ ุจูุงุก ุฌู
ูุฉ ูุชุนููู ู
ุนูู
ุงุช ูุงูุจ ุงูู
ูุดุฆ ุจุดูู ุตุฑูุญ ุ ูุง ูู
ูู ุฅุฎุฑุงุฌูุง ุจูุงุณุทุฉ ุงูู
ุญูู ุงูุจุฑู
ุฌู ุ ูุฃูู ูุง ููุฌุฏ ูุฏูู ู
ูุงู ูุนุฑุถูุง ู
ููุง. ูู
ูู ุฃู ุชุฃุชู ููุท ู
ู ุงูููู
ุฉ ุงูุงูุชุฑุงุถูุฉ. ุฃู ุฃู ูุฐุง ุงูููุฏ ูุง ูุฎุชูู ูุนููุงู ุนู ุงูููุฏ ูู ุงูู
ุซุงู ุงูุณุงุจู. ูู
ุน ุฐูู ุ ูู
ู ูุฌูุฉ ูุธุฑ ุงูู
ุญูู ุงูุจุฑู
ุฌู ุ ูููู ุตุญูุญูุง ุ ูููู ููุณ ูู ุงูู
ุซุงู ุงูุณุงุจู.
ููุฏ ุญูููุง ู
ุดููุชูุง ุงูุฃููู ุ ููููุง ููุงุฌู ู
ุดููุฉ ุซุงููุฉ ุฃูุซุฑ ุฏูุฉ. ุงูุชุฑุถ ุฃู ูุฏููุง ูุฆุฉ B
ู
ุน ู
ููุดุฆ ุงูุชุฑุงุถู ุตุฑูุญ ุ ููุฑูุฏ ุฅูุดุงุก pair<int, B>
ุถู
ูููุง:
struct B { explicit B(); }; pair<int, B> p = {};
ูู
ูููุง ุงูููุงู
ุจุฐูู ุ ูููู ููููุง ููู
ุนุงููุฑ ุ ูุฌุจ ุฃูุง ููุฌุญ ุงูุฃู
ุฑ. ููููุง ููู
ุนุงููุฑ ุ ูุฌุจ ุฃู ูููู ุงูุฒูุฌ ุงูุชุฑุงุถููุง ุถู
ูููุง ููุชู
ุฅูุดุงุคู ููุท ุฅุฐุง ูุงู ููุง ู
ู ุนูุตุฑูู ู
ูุชุฑุถูู ุถู
ูููุง ููุชู
ุชูููููู
ุง.
ุณุคุงู: ูู ูุญุชุงุฌ ุฅูู ูุชุงุจุฉ ู
ููุดุฆ ุงูุฒูุฌ ุงูุตุฑูุญ ุฃู
ูุงุ ูู C ++ 17 ุ ูุฏููุง ุญู ุณููู
ุงู: ุฏุนูุง ููุชุจ ูุฐุง ููุฐุง.
template<typename F, typename S> struct pair { F f; S s; template<typename T = F, typename U = S, typename = enable_if_t<conjunction_v< is_default_constructible<T>, is_default_constructible<U>, is_implicity_default_constructible<T>, is_implicity_default_constructible<U> >>> pair() : f(), s() {} template<...> explicit pair() : f(), s() {} };
ุงูุขู ูุฏููุง ุงุซููู ู
ู ุงูุตุงูุนูู ุงูุงูุชุฑุงุถูุฉ:
- ุณูููู
ุจูุทุน ุฃุญุฏูุง ููููุง ูู SFINAE ููุญุงูุฉ ุนูุฏู
ุง ุชููู ุงูุนูุงุตุฑ ูุงุจูุฉ ููุชุถู
ูู ุงูุชุฑุงุถููุง ุ
- ูุงูุซุงูู ููุญุงูุฉ ุงูู
ุนุงูุณุฉ.
ุจุงูู
ูุงุณุจุฉ ุ ูุชุทุจูู ููุน ุงููุชุงุจุฉ is_implicitly_default_constructible
ูู C ++ 17 ุ ุฃุนุฑู ูุฐุง ุงูุญู ุ ููููู ูุง ุฃุนุฑู ุงูุญู ุฏูู SFINAE:
template<typrname T> true_type test(T, int); template<typrname T> false_type test(int, ...); template<typrname T> using is_implicity_default_constructible = decltype(test<T>({}, 0));
ุฅุฐุง ุญุงูููุง ุงูุขู ุฅูุดุงุก pair <int, B>
ุถู
ูููุง pair <int, B>
ุนูู ุฎุทุฃ ูู ุงูุชุฑุฌู
ุฉ ุ ูู
ุง ุฃุฑุฏูุง:
template<..., typename = enable_if_t<conjuction_v< is_default_constructible<T>, is_default_constructible<U>, is_implicity_default_constructible<T>, is_implicity_default_constructible<U> >>> ... pair<int, B> p = {}; ... candidate template ignored: requirement 'conjunction_v< is_default_constructible<int>, is_default_constructible<B>, is_implicity_default_constructible<int>, is_implicity_default_constructible<B> >' was not satisfied [with T=int, U=B]
ูู ุงูู
ุฌู
ุนูู ุงูู
ุฎุชูููู ุ ุณูููู ูุฐุง ุงูุฎุทุฃ ุจุฏุฑุฌุงุช ู
ุชูุงูุชุฉ ู
ู ุงูุดู
ูููุฉ. ุนูู ุณุจูู ุงูู
ุซุงู ุ ูููู ุจุฑูุงู
ุฌ ุงูุชุญููู ุงูุจุฑู
ุฌู ูู Microsoft ูู ูุฐู ุงูุญุงูุฉ: "ูู
ููู ู
ู ุงูู
ู
ูู ุฅูุดุงุก ุฒูุฌ <int, B>
ู
ู ุงูุฃููุงุณ ุงูู
ุนูููุฉ ุงููุงุฑุบุฉ." ุณุชุถูู ุฏูู ู
ุฌูุณ ุงูุชุนุงูู ุงูุฎููุฌู ูููุงูุฌ ุฅูู ูุฐุง: "ููุฏ ุฌุฑุจูุง ู
ุซู ูุฐุง ุงูู
ูุดุฆ ููุฐุง ุ ูู
ูุฃุช ุฃู ู
ููู
ุง" ุ ูุณููููุงู ุณุจุจูุง ููู ู
ููู
ุง.
ู
ุง ุงูู
ุตู
ู
ูู ูุฏููุง ููุงุ ููุงู ู
ูุดุฆุงุช ุชู
ุฅูุดุงุคูุง ุจูุงุณุทุฉ ุจุฑูุงู
ุฌ ุงูุชุญููู ุงูุจุฑู
ุฌู ูููุณุฎ ูุงูุชุญุฑู ุ ูููุงู ุจุนุถ ู
ุง ูุชุจู ููุง. ู
ุน ุงููุณุฎ ูุงูุชุญุฑูู ุ ูู ุดูุก ุจุณูุท: ูุชููุนูู ู
ุนูู
ุฉ ูุงุญุฏุฉ ุ ูู
ุฑ ุตูุฑุงู. ุจุงููุณุจุฉ ุฅูู ุงูู
ูุดุฆ ุงูุฎุงุต ุจูุง ุ ุงูุณุจุจ ูู ุฃู ุงูุฅุญูุงู ู
ุฑู.
ุชููู ุฏูู ู
ุฌูุณ ุงูุชุนุงูู ุงูุฎููุฌู: "ูุดู ุงูุงุณุชุจุฏุงู ุ ุญุงูู ุงูุนุซูุฑ ุนูู ููุน type
ุฏุงุฎู enable_if<false>
- ุชุนุฐุฑ ุงูุนุซูุฑ ุนููู ุ ุขุณู."
ูุนุชุจุฑ ููุงูุฌ ูุฐุง ุงููุถุน ุญุงูุฉ ุฎุงุตุฉ. ูุฐูู ุ ุงูู ุฑุงุฆุน ุฌุฏุง ูุธูุฑ ูุฐุง ุงูุฎุทุฃ. ุฅุฐุง ุญุตููุง ุนูู false
ุนูุฏ ุชูููู
enable_if
ุงูุฃููู ุ ููุชุจ ุฃู ุงูุดุฑุท ุงูู
ุญุฏุฏ ุบูุฑ enable_if
.
ูู ุงูููุช ููุณู ุ enable_if
ุญูุงุชูุง ุจุฌุนู ุงูุญุงูุฉ ุงูู
ุฑููุฉ enable_if
. ูุญู ูุฑู ุฃููุง ุชุญููุช ุฅูู false
ุ ููููุง ูุง ูุฑู ูู
ุงุฐุง ุจุนุฏ.
ูู
ูู ุงูุชุบูุจ ุนูู ูุฐุง ุฅุฐุง ูู
ูุง ุจุชูุณูู
enable_if
ุฅูู ุฃุฑุจุนุฉ ุจูุฐู ุงูุทุฑููุฉ:
template<..., typename = enable_if_t<is_default_constructible<T>::value>>, typename = enable_if_t<is_default_constructible<U>::value>>, typename = enable_if_t<is_implicity_default_constructible<T>::value>>, typename = enable_if_t<is_implicity_default_constructible<U>::value>> > ...
ุงูุขู ุนูุฏู
ุง ูุญุงูู ุฅูุดุงุก ุฒูุฌ ุถู
ูููุง ุ ูุญุตู ุนูู ุฑุณุงูุฉ ู
ู
ุชุงุฒุฉ ู
ูุงุฏูุง ุฃู ู
ุซู ูุฐุง ุงูู
ุฑุดุญ ูุบูุฑ ู
ูุงุณุจ ุ ูุฃู ูุชุงุจุฉ ุงูููุน is_implicitly_default_constructable
ุฑุงุถูุฉ:
pair<int, B> p = {};
ูุฏ ูุจุฏู ุญุชู ูุซุงููุฉ ูุงุญุฏุฉ: ูู
ุงุฐุง ูุญุชุงุฌ ุฅูู ู
ูููู
ุฅุฐุง ูุงู ูุฏููุง ู
ุซู ูุฐุง ุงูู
ุญูู ุงูุจุฑู
ุฌู ุงูุฑุงุฆุนุ
ููููุง ูุชุฐูุฑ ุฃูู ูุชู
ุงุณุชุฎุฏุงู
ูุธููุชูู ูููุงูุจ ุงูุชุฑุงุถููุง ูุชุทุจูู ุงูู
ููุดุฆ ุ ูููู ูุงูุจ ุณุชุฉ ู
ุนูู
ุงุช ูููุงูุจ. ุจุงููุณุจุฉ ููุบุฉ ุงูุชู ุชุฏุนู ุฃููุง ูููุฉ ุ ูุฐุง ุชู
ุซุงู ูุตูู.
ููู ุณูุณุงุนุฏูุง C ++ 20ุ ุฃููุงู ุ ุชุฎูุต ู
ู ุงูุฃูู
ุงุท ุจุฅุนุงุฏุฉ ูุชุงุจุฉ ูุฐุง ูุชุทูุจ ุฌู
ูุฉ. ู
ุง enable_if
ุณุงุจููุง ุฏุงุฎู enable_if
ุ enable_if
ุงูุขู ุฏุงุฎู ูุณูุทุฉ ุฌู
ูุฉ ุชุชุทูุจ:
template<typename F, typename S> struct pair { F f; S s; pair() requires DefaultConstructible<F> && DefaultConstructible<S> && ImplicitlyDefaultConstructible<F> && ImplicitlyDefaultConstructible<S> : f(), s() {} explicit pair() ... };
ู
ูููู
ImplicitlyDefaultConstructible
ูู
ูู ุชูููุฐู ุจุงุณุชุฎุฏุงู
ู
ุซู ูุฐุง ูุทูู ูุชุทูุจ ุชุนุจูุฑ ุ ูุงูุชู ุฏุงุฎููุง ุชุณุชุฎุฏู
ููุท ุจูู ููุณูู ู
ู ุฃุดูุงู ู
ุฎุชููุฉ:
template<typename T> concept ImplicitlyDefaultConstructible = requires { [] (T) {} ({}); };
T
ImplicitlyDefaultConstructible
, , T
. , , SFINAE.
C++20: (conditional) explicit
( noexcept
). explicit
. , explicit
.
template<typename F, typename S> struct pair { F f; S s; explicit(!ImplicityDefaultConstructible<F> || !ImplicityDefaultConstructible<S>) pair() requires DefaultConstructible<F> && DefaultConstructible<S> : f(), s() {} };
, . , DefaultConstructible
, explicit
, explicit
.
Optional C++17
Optional
. , .
. ? , C++ :
enum Option<T> { None, Some(t) }
:
class Optional<T> { final T value; Optional() {this.value = null; } Optional(T value) {this.value = value; } }
C++: null
, value-?
C++ . initialized
storage
, , . T
, optional
T
, C++ memory model.
template<typename T> class optional { bool initialized; aligned_storage_t<sizeof(T), alignof(T)> storage; ...
, . : optional
, optional
. :
... T & get() & { return reinterpret_cast<T &>(storage); } T const & get() const & { return reinterpret_cast<T const &>(storage); } T && get() && { return move(get()); } optional() noexcept : initialized(false) {} optional(T const & value) noexcept(NothrowCopyConstructible<T>) : initialized(true) { new (&storage) T(value); } ~optional() : noexcept(NothrowDestructible<T>) { if (initialized) get().~T(); } };
optional
' . optional
, optional
, , optional
. , copy move .
. : assignment . , . . copy constructor. :
template<typename T> class optional { bool initialized; aligned_storage_t<sizeof(T), alignof(T)> storage; ... optional(optional const & other) noexcept(NothrowCopyConstructible<T>) : initialized(other.initialized) { if (initialized) new (&storage) T(other.get()); } optional& operator =(optional && other) noexcept(...) {...} };
move assignment. , :
optional
' , .- , .
- , โ , , .
T
: move constructor, move assignment :
optional& operator =(optional && other) noexcept(...) { if (initialized) { if (other.initialized) { get() = move(other.get()); } else { initialized = false; other.initilized = true; new(&other.storage) T(move(get())); get().~T(); } } else if (other.initialized) { initialized = true; other.initialized = false; new(&storage) T(move(get())); other.get().~T(); } return *this; }
noexcept
:
optional& operator =(optional && other) noexcept(NothrowAssignable<T> && NothrowMoveConstructible<T> && NothrowDestructible<T>) { if (initialized) { if (other.initialized) { get() = move(other.get()); } else { initialized = false; other.initialized = true; new (&other.storage) T(move(get())); get().~T(); } } ... }
optional
:
template<typename T> class optional { ... optional(optional const &) noexcept(NothrowCopyConstructible<T>); optional(optional &&) noexcept(NothrowMoveConstructible<T>); optional& operator =(optional const &) noexcept(...); optional& operator =(optional &&) noexcept(...); };
, pair
:
Optional
-, (, deleted), compilation error.
template class optional<unique_ptr<int>>;
, optional
unique_ptr
,
copy constructor copy assignment deleted. , , SFINAE.
copy move assignment , โ . - , copy , .
โ . copy : deleted operation , , operation:
deleted_copy_construct
delete
, โ default
;copy_construct
, copy_construct
.
template<class Base> struct deleted_copy_construct : Base { deleted_copy_construct(deleted_copy_construct const &) = delete; deleted_copy_construct(deleted_copy_construct &&) = default; deleted_copy_construct& operator =(deleted_copy_construct const &) = default; deleted_copy_construct& operator =(deleted_copy_construct &&) = default; }; template<class Base> struct copy_construct : Base { copy_construct(copy_construct const & other) noexcept(noexcept(Base::construct(other))) { Base::construct(other); } copy_construct(copy_construct &&) = default; copy_construct& operator =(copy_construct const &) = default; copy_construct& operator =(copy_construct &&) = default; };
select_copy_construct
, , CopyConstrictuble
, copy_construct
, deleted_copy_construct
:
template<typename T, class Base> using select_copy_construct = conditional_t<CopyConstructible<T> copy_construct<Base> deleted_copy_construct<Base> >;
, optional
, optional_base
, copy construct
, optional
select_copy_construct<T, optional_base<T>>
. copy :
template<typename T> class optional_base { ... void construct(optional_base const & other) noexcept(NothrowCopyConstructible<T>) { if ((initialized = other.initialized)) new (&storage) t(other.get()); } }; template<typename T> class optional : select_copy_construct<T, optional_base<T>> { ... };
. , , copy_construct
, move_construct
copy_construct
, copy_assign
, , move_construct
, , , :
template<typename T, class Base> using select_move_construct = select_copy_construct<T, conditional_t<MoveConstructible<T>, move_construct<Base> > >; template<typename T, class Base> using select_copy_assign = select_move_construct<T, conditional_t<CopyAssignable<T> && CopyConstructible<T>, copy_assign<Base> delete_copy_assign<Base> > >;
, move_assign
copy_assign
, optional_base
, assignment construct
assign
, optional
select_move_assign<T, optional_base<T>>
.
template<typename T, class Base> using select_move_assign = select_copy_assign<T, ...>; template<typename T> class optional_base { ... void construct(optional_base const&) noexcept(NothrowCopyConstructible<T>); void construct(optional_base &&) noexcept(NothrowMoveConstructible<T>); optional_base& assign(optional_base &&) noexcept(...); optional_base& assign(optional_base const &) noexcept(...); }; template<typename T> class optional : select_move_assign<T, optional_base<T>> { ... };
, :
optional<unique_ptr>
deleted_copy_construct
,
move_construct
. !
optional<unique_ptr<int>> : deleted_copy_construct<...> : move_construct<...> : deleted_copy_assign<...> : move_assign<...> : optional_base<unique_ptr<int>>
: optional
TriviallyCopyable
TriviallyCopyable
.
TriviallyCopyable
? , T
TriviallyCopyable
,
memcpy
. , .
, , , . resize
vector
TriviallyCopyable
, memcpy
, , . , , .
TriviallyCopyable
, , static_assert
', copy-move :
template<typename T> class optional : select_move_assign<T, optional_base<T>> {...}; static_assert(TriviallyCopyable<optional<int>>); static_assert(TriviallyCopyConstructible<optional<int>>); static_assert(TriviallyMoveConstructible<optional<int>>); static_assert(TriviallyCopyAssignable <optional<int>>); static_assert(TriviallyMoveAssignable <optional<int>>); static_assert(TriviallyDestructible <optional<int>>);
static_assert
' . , , . optional
โ aligned_storage
, , , , TriviallyCopyable
.
, . , TriviallyCopyable
.
, . select_copy_construct
:
template<typename T, class Base> using select_copy_construct = conditional_t<CopyConstructible<T>, copy_construct<Base> deleted_copy_construct<Base> >;
CopyContructible
copy_construct
, if
compile-time: CopyContructible
TriviallyCopyContructible
, Base
.
template<typename T, class Base> using select_copy_construct = conditional_t<CopyConstructible<T>, conditional_t<TriviallyCopyConstructible<T>, Base, copy_construct<Base> >, deleted_copy_construct<Base> >;
, copy . , select_destruct
. int
, - - , .
template<typename T, class Base> using select_destruct = conditional_t<TriviallyDenstructible<T>, Base, destruct<Base> > >;
, , . , , :
optional<unique_ptr<int>> : deleted_copy_construct<...> : move_construct<...> : deleted_copy_assign<...> : move_assign<...> : destruct<optional_base<unique_ptr<int>>> : optional_base<unique_ptr<int>>
, C++17 optional
7; : operation
, deleted_operation
select_operation
; construct
assign
. , .
- . . : deleted.
, noexcept
.
, , , trivial
, noexcept
. , , trivial
noexcept
, noexcept
, deleted
. . , , .
type trait, , . , , copy : deleted
, nothrow
, ?
, - special member, , , , :
- ,
deleted
, = delete
deleted_copy_construct
; - ,
copy_construct
, c noexcept ; - , , , .
.
optional C++20
C++20 optional
copy ?
:
T
CopyConstructible
, deleted
;TriviallyCopyConstructible
, ;noexcept
.
template<typename T> class optional { ... optional(optional const &) requires(!CopyConstructible<T>) = delete;
, . -, , T
requires clause false
. requires(false)
, , overload resolution. , requires(true)
, .
, .
requires clause = delete
:
= delete
overload resolution, , , deleted .requires(false)
overload resolution.
, copy , , requires clause. .
, . ! C++ , ? , , . , , , . , , , , , optional
.
, , GCC internal compiler error, Clang . , . , .
, , optional
C++20. , , C++17.
aligned_storage aligned_union
: aligned_storage
reinterpret_cast
, reinterpret_cast
constexpr . , compile-time optional
, compile-time. STL aligned_storage
optional
aligned_union
variant
. , , STL Boost optional
variant
. variant
, :
template<bool all_types_are_trivially_destructible, typename...> class _Variant_storage_; template<typename... _Types> using _Variant_storage = _Variant_storage_< conjunction_v<is_trivially_destructible<_Types>...>, _Types... >; template<typename _First, typename... _Rest> class _Variant_storage_<true, _First, _Rest...> { union { remove_const_t<First> _Head; _Variant_storage<_Rest...> _Tail; }; };
variant
. _Variant_storage_
, , -, , variant
, -, . , trivially_destructible
? type alias, . _Variant_storage_
, true
false
. , true
, . trivially_destructible
, union Variant
' .
, , , , . type alias _Variant_storage
. :
template<typename... _Types, bool = conjunction_v<is_trivially_destructible<_Types>...> > class _Variant_storage_;
. , variadic template . , , , _Types
. C++17 , .
C++20 ,
,
requires clause. C++20 requires clause:
template<typename... _Types> class _Variant_storage_; template<typename _First, typename... _Rest> requires(TriviallyDestructible<_First> && ... && TriviallyDestuctible<_Rest>) class _Variant_storage_<_First, _Rest...> { union { remove_const_t<_First> _Head; _Variant_storage_<_Rest...> _Tail }; };
_Variant_storage_
, TriviallyDestructible
. , requires clause , , .
requires clause template type alias
, requires clause template type alias. C++20 - enable_if
, :
template<bool condition, typename T = void> requires condition using enable_if_t = T;
,
, . :
, enable_if
. ? f()
: enable_if
, , 239, , , , 239. , :
- , , template type alias', ยซvoid f(); void f();
- , SFINAE, , , .
, enable_if
, , size < 239
, size > 239
. , . , f()
. requires clause. โ , .
โ , . C++ Russia 2019 Piter, ยซ: core languageยป . , , : reachable entity visible, ADL, entities internal linkage . , C++ Russia (JetBrains) ยซ ++20 โ ?ยป