簡體   English   中英

在具有虛函數的類上調用 std::visit 是否安全?

[英]Is it safe to call std::visit on classes with virtual functions?

我想創建一個訪問者層次結構來處理std::variant的實例。 我想重寫子類中的一些方法以獲得更專業的行為。 我的代碼如下所示:

#include <variant>
#include <cstdint>
#include <iostream>

struct Event1 {};
struct Event2 {};

using Event = std::variant<Event1, Event2>;

class Visitor {
public:
    virtual ~Visitor() = default;
    virtual void operator()(const Event1&) { std::cout << "Visitor: Event1\n"; }
    virtual void operator()(const Event2&) { std::cout << "Visitor: Event2\n"; }
};

class SubVisitor: public Visitor {
public:
    using Visitor::operator();
    virtual void operator()(const Event1&) { std::cout << "SubVisitor: Event1\n"; }
};

int main() {
    SubVisitor sv;  
    Event e;

    e = Event1{};
    std::visit(sv, e);  

    e = Event2{};
    std::visit(sv, e);
}

這編譯並且似乎工作正常:

$ g++ test.cpp -o test
$ ./test 
SubVisitor: Event1
Visitor: Event2

這樣的代碼是否定義良好並且沒有未定義行為的風險? 我見過的所有std::variant示例都使用沒有 inheritance 或 lambdas 的簡單類。

是的,需要這樣的代碼才能完成您的期望。 當您將Visitor &傳遞給std::visit ,它不會復制(並因此切片)它。

我見過的所有 std::variant 示例都使用沒有 inheritance 或 lambdas 的簡單類。

這是因為示例往往盡可能簡單。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM