void test() { double val = GetAZero<double>(); std::complex<float> valc1 = GetAZero<std::complex<float>>(); std::complex<double> valc1 = GetAZero<std::complex<double>>(); }
template <class T> T GetAZero() {return 0;} template <> std::complex<float> GetAZero() {return std::complex<float> (0, 0);} template <> std::complex<double> GetAZero() {return std::complex<double>(0, 0);}
template <class T> T GetAZero() {return 0;} template <class std::complex<T>> std::complex<T> GetAZero() {return std::complex<T> (0, 0);}
struct AZero { template <typename T> operator T() const {return 0;} template <typename T> operator std::complex<T>() const {return std::complex<T>(0, 0);} }; double val = AZero(); std::complex<float> valc1 = AZero(); std::complex<double> valc2 = AZero();
template <typename T> T GetAZero() {return 0;} template <typename T> std::complex<T> GetAZero<class std::complex<T>>() {return std::complex<T> (0, 0);}
template <typename T> struct dummy { T DoIt() const { return T(); } }; template <typename T> struct dummy<std::complex<T>> { using PT = std::complex<T>; PT DoIt() const { return PT(0, 0); } }; struct Boo { Boo() { double val = GetAZero<double>(); std::complex<float> valc1 = GetAZero<std::complex<float>>(); std::complex<double> valc2 = GetAZero<std::complex<double>>(); } template <class T> T GetAZero() { return dummy<T>().DoIt(); } };
#include <iostream> #include <complex> template<typename...P> void say(P...p){ (std::cout << ... << p); } template<typename T> T mkZero(T &t) { t=T(0); return t; } template<typename T, typename...V> T mkVal(T &t, V...v) { t=T(v...); return t; } int main() { int i; float f; double d; std::complex<int> ci; std::complex<float> cf; std::complex<double> cd; mkVal(i, 11); mkVal(f, 22.22); mkVal(d, 33); mkVal(ci, 44, 44); mkVal(cf, 5.5, 55.55); mkVal(cd, 66, 66.6); say("valued: i=", i, ", f=", f, ", d=", d, ", ci=", ci, ", cf=", cf, ", cd=", cd, "\n"); mkZero(i); mkZero(f); mkZero(d); mkZero(ci); mkZero(cf); mkZero(cd); say("zeroed: i=", i, ", f=", f, ", d=", d, ", ci=", ci, ", cf=", cf, ", cd=", cd, "\n"); return 0; }