2

我在 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 或类似的东西构造一个。

4

0 回答 0