我在 C++17 代码库中看到了类似以下的代码,并自己开始使用它:
template <class... Ts>
struct overloaded : Ts... {
using Ts::operator()...;
};
template <class... Ts>
overloaded(Ts...)->overloaded<Ts...>;
int main()
{
std::variant<int, std::string> var = "foo";
std::visit(
overloaded{
[](int) {std::cout << "int\n"; },
[](std::string) {std::cout << "string\n"; }
},
var
);
}
并试图了解overloaded
实际在做什么。在不使用可变参数模板的情况下,我相信上述内容可以扩展为:
template <typename T, typename U>
struct overloaded : T, U {
using T::operator();
using U::operator();
};
template <typename T, typename U> // <-
overloaded(T, U)->overloaded<T, U>; // <- what is this?
我理解 的定义struct overloaded
:它继承自两个 lambdas,这两个 lambdas 将通过 lambdasoperator()
定义,并说将这些operator()
s 用作 的函数调用运算符overloaded
。但是,我什至不知道其他两行在C++ 的语义方面是什么:它们似乎正在制作它,因此您可以struct overloaded
从任意 lambda 或类似的东西构造一个。