我有以下代码:
#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
,这只是一个例子。