#include <iostream>
#include <string>
#include <type_traits>

using namespace std;

template<typename U>
class A
{
public:
	static_assert(!std::is_same<int, U>::value && !std::is_same<double,U>::value,
                               "Template argument cannot be <int> or <double>.");
	A(const U& u) : u(u) {};
	explicit operator U() { return u; }
	explicit operator int() { return i; }
	explicit operator double() { return d; }

private:
	U u;
	int i = 5;
	double d = 3.14;
};

int main()
{
	A<string> a("name");
	cout << double(a) << '\n';
	cout << int(a) << '\n';
	cout << string(a) << '\n';
	return 0;
}
