Middle+
C++-ში სტატიკური პოლიმორფიზმის იდიომა როგორ ეწოდება?
sobes.tech AI
პასუხი AI-სგან
Curiously Recurring Template Pattern (CRTP), ასევე ცნობილი როგორც სტატიკური პოლიმორფიზმი ან კომპილაციის დროს პოლიმორფიზმი.
CRTP-ის პრინციპი ეფუძნება იმას, რომ შაბლონის კლასი Base იყენებს როგორც შაბლონის პარამეტრს თავის თავს, ამავდროულად ის არის გარკვეული მემკვიდრეობის კლასი Derived-ისთვის.
template <typename T>
class Base
{
public:
void interfaceMethod()
{
// სტატიკური გამოძახება 'implementationMethod'-ის
// ობიექტზე ტიპის Derived (რომელიც T-ია)
static_cast<T*>(this)->implementationMethod();
}
// ვირტუალური მეთოდი აქ არ არის საჭირო
};
class Derived : public Base<Derived>
{
public:
void implementationMethod()
{
// სპეციფიკური რეალიზაცია Derived-ისთვის
// ...
}
};
CRTP-ის უპირატესობები დინამიკურ პოლიმორფიზმთან შედარებით (ვირტუალურ ფუნქციებთან):
- შესრულება: ფუნქციების გამოძახებები სტატიკურია და გადაწყდება კომპილაციის დროს, თავიდან აიცილებს ვირტუალურ სქემას.
- ვირტუალურ ფუნქციებზე ხარჯების გარეშე: არ არის საჭირო vptr/vtbl-ის შენახვა და გამოყენება.
- კატეგორიული ტიპიზაცია: შეცდომები, რომლებიც დაკავშირებულია ტიპების შეუთავსებლობასთან ან რეალიზაციის არარსებობასთან, იპოვება კომპილაციის დროს.
მოხერხებულობები:
- პატრონული ტიპის ცოდნა აუცილებელია:
Baseკლასი უნდა იყოს შაბლონის კლასი და "იცოდეს" წარმოებული კლასი. - სირთულე დამწყებთათვის: ეს პატერნი შეიძლება იყოს ნაკლებად ინტუიტიური შედარებით კლასიკურ მემკვიდრეობასთან ვირტუალურ ფუნქციებთან.
- შეუძლებელია სხვადასხვა CRTP ტიპების კოლექციის მუშაობა: ერთ კონტეინერში არ შეიძლება შეინახოთ სხვადასხვა წარმოებული CRTP კლასების ობიექტები და გამოიძახოთ მათი მეთოდები ძირითადი მითითებლის ან მითითების საშუალებით.
შედარება დინამიკურ პოლიმორფიზმთან:
| ასპექტი | CRTP (სტატიკური პოლიმორფიზმი) | დინამიკური პოლიმორფიზმი (ვირტუალურ ფუნქციები) |
|---|---|---|
| გამოძახების გადაწყვეტა | კომპილაციის დრო | შესრულების დრო |
| წარმოების ეფექტურობა | მაღალი (vtbl ხარჯების გარეშე) | დაბალი (vtbl ხარჯებით) |
| ხარჯები | vptr/vtbl არ არის საჭირო | არსებობს vptr/vtbl |
| მოქნილობა (კოლექციები) | არა (შეუძლებელია სხვადასხვა ტიპების მუშაობა საერთო მითითებლის/შესახებ) | დიახ (შეუძლებელია სხვადასხვა ტიპების მუშაობა) |
| შეცდომების გამოვლენა | კომპილაციის დროს | შესრულების დროს |
| სირთულე | უფრო მაღალი დამწყებთათვის | უფრო დაბალი დამწყებთათვის |