Task type
- C++ kursu
- İleri seviye
- Ders 71/83
- 5 dk
Task ve promise type öğrenirsin.
Task ve promise type
Bir Task türü, coroutine'in dönüş türüdür ve içinde bir promise_type içerir. promise_type, coroutine'in başlama, bitirme ve değer döndürme davranışını tanımlar.
Bir promise_type'ın zorunlu üyeleri şunlardır: get_return_object (Task nesnesini üretir), initial_suspend (başlangıçta askıya alma), final_suspend (bitişte askıya alma), return_void veya return_value (bitirme) ve unhandled_exception (hata). Bu üyeler, coroutine'in iskeletini oluşturur. Eksik olursa derleme hatası alırsın.
Askıya alma üyeleri
initial_suspend ve final_suspend, coroutine'in başında ve sonunda ne olduğunu belirler. std::suspend_never dönerse coroutine hemen çalışır; std::suspend_always dönerse askıya alınır.
Bir Task çoğunlukla initial_suspend için suspend_never (hemen başla) ve final_suspend için suspend_always (çerçeveyi yaşat) kullanır. Böylece coroutine başlar, değer üretir ve bittiğinde çerçeve kalır; dışarıdan okunabilir. noexcept ile de işaretlenirler çünkü final_suspend istisna fırlatmamalıdır.
Uygulama Task promise_type tamamla
promise_type içine std::suspend_never initial_suspend() { return {}; } ve std::suspend_never final_suspend() noexcept { return {}; } üyelerini ekle. main içindeki kod hazırdır; dokunma.
Başlangıç kodu
#include <iostream>
#include <coroutine>
struct Task {
struct promise_type {
Task get_return_object() { return {std::coroutine_handle<promise_type>::from_promise(*this)}; }
// initial_suspend ve final_suspend ekle
void return_void() { }
void unhandled_exception() { }
};
std::coroutine_handle<promise_type> handle;
};
Task run() {
co_return;
}
int main() {
run();
std::cout << "Task testi geçti";
return 0;
}Örnek çözüm
#include <iostream>
#include <coroutine>
struct Task {
struct promise_type {
Task get_return_object() { return {std::coroutine_handle<promise_type>::from_promise(*this)}; }
std::suspend_never initial_suspend() { return {}; }
std::suspend_never final_suspend() noexcept { return {}; }
void return_void() { }
void unhandled_exception() { }
};
std::coroutine_handle<promise_type> handle;
};
Task run() {
co_return;
}
int main() {
run();
std::cout << "Task testi geçti";
return 0;
}Beklenen çıktı
Task testi geçti
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 promise_type üyesi
struct promise_type { Task ____() { return {}; } };
struct promise_type { Task get_return_object() { return {}; } };
Açıklama: get_return_object, Task nesnesini promise'tan üretir.
2 promise_type ne yapar?
- Coroutine'in hızını artırır
- Coroutine'i siler
- Coroutine'in başlama, bitirme ve değer döndürme davranışını tanımlar Doğru cevap
- Coroutine'in parametrelerini sayar
Açıklama: promise_type, coroutine'in davranış sözleşmesini tanımlar.
3 Üyeyi rolüne eşle
| Kavram | Anlamı |
|---|---|
get_return_object |
Task nesnesini üretir |
initial_suspend |
Başlangıç askısı |
final_suspend |
Bitiş askısı |
unhandled_exception |
Hata yakalama |