我正在查看这里的
所以我的问题是:在提供的示例中,在多态lambda表达式和“重载函数对象”中都有一些“魔法”,使得从
因此,看着这个:
对于每个变量
我们将多态lambda作为可调用对象传递给访问者,
std:variant
/std::visit
文档:http://en.cppreference.com/w/cpp/utility/variant/visit,并且也通过谷歌搜索了很多,试图理解std::visit
和std::variant
背后的魔力。所以我的问题是:在提供的示例中,在多态lambda表达式和“重载函数对象”中都有一些“魔法”,使得从
std::variant
中提取正确类型成为可能。因此,看着这个:
for (auto& v: vec) {
std::visit(overloaded {
[](auto arg) { std::cout << arg << ' '; },
[](double arg) { std::cout << std::fixed << arg << ' '; },
[](const std::string& arg) { std::cout << std::quoted(arg) << ' '; },
}, v);
}
对于每个变量
v
,如何调用正确的重载lambda函数?似乎有一些逻辑需要确定特定std::variant
持有的确切类型,将其强制转换并将其分派到正确的函数。我的问题是它是如何工作的?对于这个问题也是同样的情况: std::visit([](auto&& arg) {
using T = std::decay_t<decltype(arg)>;
if constexpr (std::is_same_v<T, int>)
std::cout << "int with value " << arg << '\n';
else if constexpr (std::is_same_v<T, long>)
std::cout << "long with value " << arg << '\n';
else if constexpr (std::is_same_v<T, double>)
std::cout << "double with value " << arg << '\n';
else if constexpr (std::is_same_v<T, std::string>)
std::cout << "std::string with value " << std::quoted(arg) << '\n';
else
static_assert(always_false<T>::value, "non-exhaustive visitor!");
}, w);
我们将多态lambda作为可调用对象传递给访问者,
w
是一些可以容纳int、long、double或std::string的变量。那么,哪里有逻辑来确定正确的类型呢?因此,使用using T = std::decay_t<decltype(arg)>;
来检索特定实例的实际类型。
std::visit
的实现吗? - cpplearner