Мазмунга өтүү

Шаблондорду метапрограммалоо

Сабактын башталышы

Шаблондорду метапрограммалоо

Компиляторду коддун иштеши башталганга чейин типтерди жана маанилерди эсептеген программага айландыруу

Негизги идея: C++ шаблону — бул ар бир тип үчүн классты көчүрбөө ыкмасы гана эмес. Бул компилятордун ичинде иштеген кичинекей функционалдык программалоо тили. Шаблондорду метапрограммалоо (TMP) дегени — милдети компиляция учурунда типтерди жана константалык маанилерди эсептөө болгон код жазуу, ошондо аткаруу этабы үчүн машина коду мурдатан адистештирилген, текшерилген жана аткаруу учурунда убакытты же коопсуздукту талап кыла турган чечимдерден бош болот.
Аягында сиз мына буларды жасай аласыз:
  • эки фазалуу моделди түшүндүрүү: компилятор эмнени эсептейт, процессор эмнени эсептейт;
  • constexpr функциялары жана consteval (C++20) менен эсептөөнү компиляция этабына которуу;
  • <type_traits> китепканасы менен типтерди изилдөө жана өзгөртүү;
  • чаташкан перегрузкалардын ордуна if constexpr аркылуу бир функциянын ичинде типтер боюнча бутактоо;
  • static_assert менен компиляция этабында келишимдерди камсыздоо жана TMP чыныгы алмашууларын түшүнүү.

1. Эки дүйнө: компиляция убактысы жана аткаруу убактысы

Ар бир C++ программасы эки дүйнөдө жашайт. Компиляция убактысынын дүйнөсүндө компилятор типтерди жана константалык туюнтмаларды башкарат, шаблондорду инстанцирлейт жана constexpr кодду эсептейт. Аткаруу убактысынын дүйнөсүндө процессор компиляциядан аман калган машина кодун аткарат. Метапрограммалоо — бул мүмкүн болушунча көп пайдалуу ишти биринчи дүйнөдө жасап, экинчисине аз калтыруу өнөрү.

Шаблондорду сиз орто курстан билесиз: template<typename T> бир аныктаманын көп типке кызмат кылышына мүмкүндүк берет. TMP үчүн негизги ой — шаблонду инстанцирлөө өзү эсептөө болуп саналат. Сиз std::vector<int> деп жазганда, компилятор вектор шаблонун int аргументи менен иштетип, таптакыр жаңы тип чыгарат. Шаблонго башка аргументтерди берсеңиз — башка типтерди эсептейт: бул компилятор аткарган типтерден (жана маанилерден) типтерге (жана маанилерге) карай таза функция.

Эмне үчүн керек? Үч конкреттүү пайда:

  • Ылдамдык: компиляция этабында эсептелген маани бинардык файлда литерал болуп калат; процессор аны кайра эсептебейт.
  • Коопсуздук: компиляция учурунда кармалган ката эч качан колдонуучуга жетпейт. static_assert логикалык катаны курулуш катасына айлантат.
  • Чыгымсыз жалпылык: бир жалпы алгоритм аткаруу убактысында нөл бутактоо менен ар бир типке адистеше алат.
Эреже: эгер жооп компиляторда буга чейин бар маалыматка гана көз каранды болсо (типтер, литералдар, өлчөмдөр), аны компиляция этабында эсептеңиз.

Бул сабакты YourAIZone платформасында улантыңыз

Толук сабакта — толук түшүндүрмө, чыгарылган мисалдар, көп кездешкен каталар, заматта текшерилүүчү тесттер жана ЖИ-репетитор. Конок катары дароо баштаңыз же прогрессти сактоо үчүн аккаунт түзүңүз.

Толук сабакта

  • Толук түшүндүрмө
  • Чыгарылган мисалдар
  • Көп кездешкен каталар жана алардан кантип качуу керек
  • Тест суроолору: 15
  • Тема боюнча суроолорго жооп берген ЖИ-репетитор
  • Окуучу, ата-эне жана мугалим үчүн прогрессти көзөмөлдөө