#include <variant>
#include <iostream>
template<typename ... Ts>
struct Overload : Ts ... {
using Ts::operator() ...; //(1)
};
template<class... Ts> Overload(Ts...) -> Overload<Ts...>;
int main(){
std::variant<char, int, float> v = 2017;
std::string typeOfIntegral = std::visit( Overload {
[](char) { return "char"; },
[](int) { return "int"; },
[](auto) { return "unknown type"; },
}, v);
std::cout << typeOfIntegral << std::endl;
}