1

我有以下代码:

#include <iostream>
#include <string>
#include <variant>

template <class... Ts>
struct overloaded : Ts...
{
    using Ts::operator()...;
};
template <class... Ts>
overloaded(Ts...) -> overloaded<Ts...>;

template<typename... Fns, typename... Ts>
void xvisit(std::variant<Ts...> var, const Fns... fns ){
    std::visit(overloaded{fns...}, var);
}

它似乎工作正常(godbolt ,但我找不到办法让.std::variant<Ts...>xvisit

例如,当我交换参数的顺序时,我会从 clang 和 gcc 中得到无用的错误:

注意:'<lambda(const string&)>' 不是从 'std::variant<_Types ...>' 派生的

注意:候选模板被忽略:无法将 'variant<type-parameter-0-1...>' 与 '(lambda at :23:17)' 匹配

Godbolt有问题的 xvisit2。

这可以解决,还是我遇到了一些语言限制?

注意:我知道xvisit不应该返回void,这只是一个例子。

4

0 回答 0