std::visit
variant seçeneklerini işleyin
std::visit, CoddyKit'te ücretsiz bir C++ Academy dersidir. Bu, 4 dersinin 4. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, C++ Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. C++ Academy kursu toplamda 4 dersten oluşur.
std::visit Neden Kullanılmalı?
Her alternatifi get_if ile elle denetlemek kodu gereksiz yere uzatır. std::visit, varyantın o anda tuttuğu türe çağrılabilir bir işlem uygular ve yönlendirmeyi sizin için yapar.
#include <iostream>
#include <variant>
int main() {
std::variant<int, double> v = 4;
std::visit([](auto x){ std::cout << x << "\n"; }, v);
}Genel Bir Lambda Ziyaretçisi
auto alan bir lambda, gövdesi tüm alternatifler için derlenebiliyorsa her alternatifle çalışır. Burada etkin olan tür ne olursa olsun onu yazdırıyoruz.
#include <iostream>
#include <string>
#include <variant>
int main() {
std::variant<int, std::string> v = std::string("hi");
std::visit([](const auto& x){ std::cout << x << "\n"; }, v);
}Değer Döndürme
std::visit bir değer döndürebilir. Her dal aynı türü döndürmelidir.
#include <iostream>
#include <variant>
int main() {
std::variant<int, double> v = 2.5;
double d = std::visit([](auto x){ return x * 2.0; }, v);
std::cout << d << "\n";
}if constexpr ile Tür Başına Davranış
Tek bir genel lambda içinde türe göre farklı davranmak için if constexpr yapısını std::decay_t ve std::is_same_v ile birleştirin.
#include <iostream>
#include <string>
#include <variant>
#include <type_traits>
int main() {
std::variant<int, std::string> v = 5;
std::visit([](const auto& x){
using T = std::decay_t<decltype(x)>;
if constexpr (std::is_same_v<T, int>) std::cout << "int " << x << "\n";
else std::cout << "str " << x << "\n";
}, v);
}Yapı Ziyaretçisi
Ayrıca her tür için bir tane olmak üzere birden çok operator() aşırı yüklemesine sahip bir yapı yazabilirsiniz. Derleyici eşleşen aşırı yüklemeyi seçer.
#include <iostream>
#include <string>
#include <variant>
struct Printer {
void operator()(int i) const { std::cout << "int " << i << "\n"; }
void operator()(const std::string& s) const { std::cout << "str " << s << "\n"; }
};
int main() {
std::variant<int, std::string> v = std::string("yo");
std::visit(Printer{}, v);
}overloaded Deyimi
Yaygın bir yardımcı, birkaç lambdayı tek bir ziyaretçide birleştirir. Her lambda belirli bir türü işler.
#include <iostream>
#include <string>
#include <variant>
template<class... Ts> struct overloaded : Ts... { using Ts::operator()...; };
template<class... Ts> overloaded(Ts...) -> overloaded<Ts...>;
int main() {
std::variant<int, std::string> v = 8;
std::visit(overloaded{
[](int i){ std::cout << "i=" << i << "\n"; },
[](const std::string& s){ std::cout << "s=" << s << "\n"; }
}, v);
}Tüm Alternatifleri Ele Alma
Bir ziyaretçi her alternatifi ele almalıdır; aksi takdirde kod derlenemez. Bu derleme zamanı denetimi, bir durumu unutmanızı önler.
Ziyaret Etme ve Değiştirme
Varyantı const olmayan bir başvuru olarak geçirirseniz ziyaretçi, saklanan değeri yerinde değiştirebilir.
#include <iostream>
#include <variant>
int main() {
std::variant<int, double> v = 10;
std::visit([](auto& x){ x += 1; }, v);
std::cout << std::get<int>(v) << "\n";
}Birden Çok Varyant
std::visit aynı anda birden çok varyant alabilir; bu durumda ziyaretçi her varyant için bir bağımsız değişken alır.
#include <iostream>
#include <variant>
int main() {
std::variant<int, double> a = 2;
std::variant<int, double> b = 3.0;
auto sum = std::visit([](auto x, auto y){ return x + y; }, a, b);
std::cout << sum << "\n";
}Ziyaretçi Biçimine Karar Verme
Tekdüze işlemler için genel bir auto lambdası, türe özel temiz bir mantık için overloaded deyimini ve davranış çağrı noktaları arasında yeniden kullanılacaksa bir yapı ziyaretçisini kullanın.
visit ile get_if Karşılaştırması
Tek bir hızlı denetim için get_if uygundur; ancak std::visit daha iyi ölçeklenir: tüm alternatiflerin ele alınmasını zorunlu kılar ve türe özel tüm mantığı tek bir yerde tutar.
Kısa Kontrol
std::visit hakkındaki anlayışınızı kontrol edin.
Özet
std::visit hakkında şunları öğrendiniz:
- Çağrılabilir bir işlemi etkin alternatife yönlendirir.
- Genel lambdaları,
if constexpryapısını, yapı ziyaretçilerini veya overloaded deyimini kullanabilirsiniz. - Ziyaretçiler tüm alternatifleri kapsamalıdır (derleme zamanı denetimi).
- Değer döndürebilir ve birden çok varyantı birlikte ziyaret edebilir.
Sıkça Sorulan Sorular
“std::visit” dersi ücretsiz mi?
Evet — “std::visit” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve C++ Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. C++ Academy kursu toplamda 4 dersten oluşur.
“std::visit” dersinde ne öğreneceğim?
variant seçeneklerini işleyin C++ Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.
C++ Academy öğrenmeye başlamak için deneyim gerekli mi?
Önceden deneyim gerekmez. CoddyKit'te C++ Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 4. dersidir.
“std::visit” dersi ne kadar sürer?
Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.
Bu C++ Academy dersinde kod yazıp çalıştırabilir miyim?
Evet. Her C++ Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.