¡Genial!
Esto ya empieza a tener cara y ojos:
Código C++:
Ver original#include <type_traits>
template <typename... Ts> union variant {};
template<>
union variant<> {
public:
template<typename U>
variant(const U&) {};
};
template<typename T, typename... Ts>
union variant<T, Ts...>
{
public:
template<typename U, typename std::enable_if<std::is_same<U, T>::value, int>::type = 0>
variant(const U& u) : head(u) { }
template<typename U, typename std::enable_if<!std::is_same<U, T>::value, int>::type = 0>
variant(const U& u) : tail(u) { }
T head;
variant<Ts...> tail;
};
template<typename U, typename T, typename... Ts,
typename std::enable_if<std::is_same<U, T>::value, int>::type = 0>
U get(const variant<T, Ts...>& vnt) {
return vnt.head;
}
template<typename U, typename T, typename... Ts,
typename std::enable_if<!std::is_same<U, T>::value, int>::type = 0>
U get(const variant<T, Ts...>& vnt) {
return get<U>(vnt.tail);
}
int main() {
variant<double, int> x = 1.8;
std::cout << get<double>(x) << std::endl; // 1.8
std::cout << get<int>(x) << std::endl; // no se almacena igual un int que un double, sale un numero raro
variant<double, int> y = "blabla"; // esto debería dar error pero no lo da.
//std::cout << get<unsigned>(x) << std::endl; // esto da error por no existir unsigned
return 0;
}
Ahora toca pensar como restringir el numero de constructores a los definidos en el template.
Muchas gracias,
eferion.