fork download
#include <iostream>
#include <vector>

template <typename T> class example; // in order to extern

template <typename T> inline class example<T> example_add(const class example<T>& lhs, const class example<T>& rhs){ return example<T>(lhs.val()+rhs.val()); }
template <typename T> inline class example<T> example_add(const class example<T>& lhs, const               T & rhs){ return example<T>(lhs.val()+rhs); }

template <typename T>
class example{
private:
    T value;
public:
    example(){ value=(T)0; }
    example(const T& rhs){ value=rhs; }
    ~example(){}
    T val() const { return value; }
    
    class example<T> operator+(const class example<T>& rhs){ return example_add(*this, rhs); }
    class example<T> operator+(const               T & rhs){ return example_add(*this, rhs); }
};

template <typename T>
void print(const class example<T>& rhs){ std::cout<<" = "<<rhs.val()<<std::endl; }

#define printn(var) {printf("%s", #var);print(var);}
#define printn_all(var) {printf("%s(%d): ", __func__, __LINE__);printf("%s", #var);print(var);}

int main(){
    class example<double> v1(1.0), v2(2.0), v3(3.0), buf;
    printn(v1);
    printn(v2);
    printn(v3);
    printn(v1+v2+v3);
    
    buf=v1+v2+v3+4.0;
    printn(buf);
    
    return 0;
}
Success #stdin #stdout 0s 4344KB
stdin
Standard input is empty
stdout
v1 = 1
v2 = 2
v3 = 3
v1+v2+v3 = 6
buf = 10