C++:使用std::variant+函数重载实现运行期多态

C++中使用运行期多态,需要用继承+虚函数:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <iostream>
#include <string>

struct Base {
virtual std::string Method() = 0;
};

struct D1: Base {
std::string Method() override;
};

struct D2: Base {
std::string Method() override;
};

std::string D1::Method() { return "I'm D1"; }
std::string D2::Method() { return "I'm D2"; }

void callMethod(Base& obj) {
std::cout << obj.Method() << "\n";
}

int main() {
D1 a;
D2 b;
callMethod(a);
callMethod(b);
}

输出:

1
2
I'm D1
I'm D2

实际上C++17的std::variant配合函数重载也能实现这样的运行期多态:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <iostream>
#include <string>
#include <variant>
struct D1 {};
struct D2 {};

typedef std::variant<D1, D2> Base;

std::string Method(D1& self) { return "I'm D1"; }
std::string Method(D2& self) { return "I'm D2"; }


void callMethod(Base& v) {
std::visit([](auto && obj){
std::cout << Method(obj) << "\n";
}, v);
}

int main() {
Base a = Base(D1());
Base b = Base(D2());
callMethod(a);
callMethod(b);
}