【发布时间】:2019-03-20 03:01:05
【问题描述】:
我想使用std::variant 处理变体类型,但遇到了一些问题。
#include <string>
#include <vector>
#include <tuple>
#include <variant>
template<class... Ts> struct overloaded : Ts... { using Ts::operator()...; };
template<class... Ts> overloaded(Ts...)->overloaded<Ts...>;
void test_variant()
{
using A = int;
using B = double;
using C = std::string;
using var_t = std::variant<A, B, C>;
using var_pair_t = std::tuple<var_t, var_t>;
std::vector<var_pair_t> vec;
for (var_pair_t const& var_pair : vec)
std::visit(overloaded{
[](std::tuple<A, A> const& pair_A) {},
[](std::tuple<B, B> const& pair_B) {},
[](std::tuple<C, C> const& pair_C) {},
[](auto const& arg) {},
}, var_pair);
}
在 GCC 上:https://gcc.godbolt.org/z/p1ljQv
在 VS2017 上编译器报错:
C2672:“函数”:找不到匹配的重载函数
C2783:“声明”:无法推断“标识符”的模板参数
我想处理同一类型的对。我做错了什么?我想不同类型的对会匹配auto const& arg,所以所有对都应该正确匹配。
【问题讨论】: