std::visit
عالج البدائل في variant
std::visit درس مجاني في C++ Academy على CoddyKit. هذا هو الدرس 4 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في C++ Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة C++ Academy 4 دروس في المجموع.
لماذا نستخدم std::visit؟
يصبح التحقق اليدوي من كل بديل باستخدام get_if مطوّلًا. تطبّق std::visit دالة قابلة للاستدعاء على النوع الذي يحتويه variant حاليًا، وتتولى عملية التوجيه نيابةً عنكم.
#include <iostream>
#include <variant>
int main() {
std::variant<int, double> v = 4;
std::visit([](auto x){ std::cout << x << "\n"; }, v);
}زائر Lambda عام
تعمل lambda التي تتلقى auto مع كل بديل، ما دام جسمها قابلًا للترجمة لجميع البدائل. نطبع هنا النوع النشط أيًا كان.
#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);
}إرجاع قيمة
يمكن لـ std::visit إرجاع قيمة. ويجب أن يعيد كل فرع النوع نفسه.
#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
للتصرف بطريقة مختلفة لكل نوع داخل lambda عامة واحدة، ادمجوا if constexpr مع std::decay_t وstd::is_same_v.
#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);
}زائر من نوع Struct
يمكنكم أيضًا كتابة struct يحتوي على عدة تحميلات زائدة لـ operator()، واحدة لكل نوع. يختار المترجم التحميلة المطابقة.
#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
تجمع أداة مساعدة شائعة عدة lambdas في زائر واحد. وتتولى كل lambda معالجة نوع محدد.
#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);
}الشمولية
يجب أن يعالج الزائر كل بديل، وإلا تفشل ترجمة الشيفرة. ويمنع هذا التحقق وقت الترجمة نسيان أي حالة.
الزيارة والتعديل
إذا مرّرتم variant بمرجع غير ثابت، فيمكن للزائر تعديل القيمة المخزّنة في مكانها.
#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";
}عدة Variants
يمكن لـ std::visit استقبال عدة variants في آنٍ واحد؛ وعندها يتلقى الزائر وسيطًا واحدًا لكل variant.
#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";
}اختيار نمط الزائر
استخدموا lambda عامة من نوع auto للمعالجة الموحدة، ونمط Overloaded لمنطق نظيف خاص بكل نوع، وزائر struct عندما يكون السلوك قابلًا لإعادة الاستخدام عبر مواضع الاستدعاء.
Visit أم get_if
يُعد get_if مناسبًا لتحقق سريع واحد، لكن std::visit يتوسع بصورة أفضل: فهو يفرض شمولية المعالجة ويحافظ على كل المنطق الخاص بالأنواع في مكان واحد.
تحقق سريع
تحقّقوا من فهمكم لـ std::visit.
مراجعة
تعلّمتم std::visit:
- يوجّه دالة قابلة للاستدعاء إلى البديل النشط.
- استخدموا lambdas عامة، أو
if constexpr، أو زوار struct، أو نمط Overloaded. - يجب أن يكون الزائر شاملًا (ويُتحقق من ذلك وقت الترجمة).
- يمكنه إرجاع قيم وزيارة عدة variants معًا.
الأسئلة الشائعة
هل درس «std::visit» مجاني؟
نعم — نص درس «std::visit» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة C++ Academy، انتقل إلى CoddyKit PRO. تتضمن دورة C++ Academy 4 دروس في المجموع.
ماذا ستتعلم في «std::visit»؟
عالج البدائل في variant تتمرن على C++ Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ C++ Academy؟
لا تُشترط خبرة سابقة. C++ Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 4 من أصل 4.
كم من الوقت يستغرق درس «std::visit»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس C++ Academy هذا؟
نعم. كل درس في C++ Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.