#include <iostream>
#include <string>
#include <boost/variant.hpp>
template <typename T>
struct conversion_traits
{
typedef T type;
};
template <>
struct conversion_traits<const char*>
{
typedef std::string type;
};
template <template <typename> class conv_traits, typename... Types>
struct my_variant : public boost::variant<Types...>
{
using boost::variant<Types...>::variant;
template <typename T>
auto operator=(T rhs)
{
return boost::variant<Types...>::operator=(static_cast<typename conv_traits<T>::type>(rhs));
}
};
int main()
{
my_variant<conversion_traits, std::string, void const*> foo;
foo = "bar";
std::cout << foo.which();
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8c3RyaW5nPgojaW5jbHVkZSA8Ym9vc3QvdmFyaWFudC5ocHA+Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4Kc3RydWN0IGNvbnZlcnNpb25fdHJhaXRzCnsKCXR5cGVkZWYgVCB0eXBlOwp9OwoKdGVtcGxhdGUgPD4Kc3RydWN0IGNvbnZlcnNpb25fdHJhaXRzPGNvbnN0IGNoYXIqPgp7Cgl0eXBlZGVmIHN0ZDo6c3RyaW5nIHR5cGU7Cn07Cgp0ZW1wbGF0ZSA8dGVtcGxhdGUgPHR5cGVuYW1lPiBjbGFzcyBjb252X3RyYWl0cywgdHlwZW5hbWUuLi4gVHlwZXM+CnN0cnVjdCBteV92YXJpYW50IDogcHVibGljIGJvb3N0Ojp2YXJpYW50PFR5cGVzLi4uPgp7CiAgICB1c2luZyBib29zdDo6dmFyaWFudDxUeXBlcy4uLj46OnZhcmlhbnQ7CgoJdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CiAgICBhdXRvIG9wZXJhdG9yPShUIHJocykKICAgIHsKICAgICAgICByZXR1cm4gYm9vc3Q6OnZhcmlhbnQ8VHlwZXMuLi4+OjpvcGVyYXRvcj0oc3RhdGljX2Nhc3Q8dHlwZW5hbWUgY29udl90cmFpdHM8VD46OnR5cGU+KHJocykpOwogICAgfQp9OwoKaW50IG1haW4oKSAKewogICAgbXlfdmFyaWFudDxjb252ZXJzaW9uX3RyYWl0cywgc3RkOjpzdHJpbmcsIHZvaWQgY29uc3QqPiBmb287CiAgICBmb28gPSAiYmFyIjsKICAgIHN0ZDo6Y291dCA8PCBmb28ud2hpY2goKTsgCiAgICByZXR1cm4gMDsKfQ==