การเข้าถึงสมาชิก struct ทั่วไปใน std::variant

ฉันมีปัญหาในการทำความเข้าใจวิธีใช้ std::variant ใน C ++ 17 เมื่อพิจารณาสองโครงสร้าง A และ B และ std::vector<std::variant<A,B>> vs ฉันต้องการ:

  • อ้างถึงสมาชิกโครงสร้างทั่วไปเช่น n;
  • เรียกใช้ฟังก์ชันทั่วไป เช่น fun() หรือ add()
#include <iostream>
#include <variant>
#include <vector>

struct A {
    int n;
    void fun() { std::cout << "fun\n"; }
    int add(int m) { return n+m; }
};
struct B {
    int n;
    void fun() { std::cout << "fun\n"; }
    int add(int m) { return n+m; }
};

int main() {
    std::vector<std::variant<A,B>> vs;
    vs.push_back(A{10,11});
    vs.push_back(B{20,22});
    
    // How to refer to struct members without using std::get<v.index()>(v)?
    for (auto && v : vs) {
         // 1. How to refer to v.n?
         // 2. How to call v.fun()?
         // 3. How to call v.add() with input parameter m?
    }
}

ฉันถูกบอกให้ใช้ std::visit แต่ฉันตรงไปตรงมาเกินกว่าจะเข้าใจวิธีการทำงาน ใครช่วยแสดงตัวอย่างง่ายๆ ที่นี่ได้ไหม


person WDC    schedule 31.08.2020    source แหล่งที่มา
comment
คุณได้ดู cppreference แล้วหรือยัง   -  person Barry    schedule 31.08.2020
comment
ทำตัวอย่างบน en.cppreference.com/w/cpp/utility/variant/ หรือไม่ ไปที่ ช่วยเหลือ? ส่วนไหนที่ทำให้คุณสับสน?   -  person user975989    schedule 31.08.2020
comment
ขอบคุณทุกคน. ดูเหมือนว่าฉันไม่เข้าใจการแสดงออกของแลมบ์ดา ...   -  person WDC    schedule 31.08.2020


คำตอบ (1)


ใช้ std::visit กับแลมบ์ดาที่มีพารามิเตอร์ auto&& เพื่อเข้าถึงสมาชิกที่ใช้ร่วมกันในตัวแปรทุกประเภท ในตัวอย่างของคุณ:

for (auto&& v : vs) {
    std::visit([&](auto&& x){
        std::cout << x.n << x.add(1);
        x.fun();
    }, v);
}
person AtnNn    schedule 31.08.2020
comment
ทำไม && ถ้าเราไม่ได้ตั้งใจจะย้ายจากมัน? - person Vorac; 03.08.2021