使用虚函数在 类 上调用 std::visit 安全吗?

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

我想创建一个访问者层次结构来处理 std::variant 的实例。我想覆盖 sub类 中的一些方法以获得更专业的行为。我的代码如下所示:

#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 我见过的所有示例都使用没有继承的简单 类 或 lambda。

是的,需要这样的代码才能达到您的预期。当您将 Visitor & 传递给 std::visit 时,它不会复制(因此切片)它。

All examples of std::variant I've seen use either simple classes with no inheritance or lambdas.

这是因为示例往往越简单越好。