[英]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.