【发布时间】:2021-11-10 06:30:08
【问题描述】:
以下代码基本上是 CPP 参考上的变体示例的更“幼稚”版本。它定义了一个std::variant 类型(第[1] 行)并使用std::visit 迭代该类型的向量。在这里,我在 std::visit 函数中使用了一个仿函数(第 [2] 行),试图更好地理解 std::visit 的工作原理。
最让我困惑的是第 [4] 和 [5] 行。看来Print{}(带大括号)或Print()(带括号)都可以作为std::visit 函数的第一个参数。后者,即Print(),是一个实例化,因此提供一个对象作为第一个参数,这是可以理解的。我不太明白为什么前者Print{} 也有效。谁能解释一下这个特殊性?
using var_t = std::variant<int, long, double, std::string>; // [1]
class Print { // [2]
public:
void operator()(int arg) {
std::cout << "Integer is " << arg << '\n';
}
void operator()(double arg) {
std::cout << "Double precision is " << arg << '\n';
}
void operator()(long arg) {
std::cout << "Long type is " << arg << '\n';
}
void operator()(const std::string& arg) {
std::cout << "String is " << arg << '\n';
}
};
std::vector<var_t> vec = {10, 15l, 1.5, "Hello, World", 900}; // [3]
for (auto& v : vec) {
//std::visit(Print{}, v); // [4]
std::visit(Print(), v); // [5]
}
【问题讨论】:
-
这是一个不同的初始化。
Print{}使用聚合初始化,Print()使用构造函数初始化。 -
Print是一个聚合,所以可以通过aggregate initialization初始化。