Light weight Modern CPP interface to simulate C++11 standard for old C++98 compilers
#if (__cplusplus < 201103L)
	#include "type_traits.h"
	#include "thread.h"
	#include "mutex.h"
	#include "atomic.h"
	#include "unique_ptr.h"
	using namespace ModernCPP;
	#define AUTO(x,y) autotypeof<__typeof__(y)>::type x = y
#else
	#include <thread>
	#include <mutex>
	#include <atomic>
	#include <functional>
	using namespace std;
	#define AUTO(x,y) auto x = y
#endif 
#include <iostream>
void func() {
    std::cout<<"hello"<<std::endl;
}
int main()
{
    thread t(func);
	t.join();
}mutex m;
unsigned long counter(0);
class Sample {
	unsigned long x;
	public:
	Sample(unsigned long x=10):x(x){}
	void operator () (){
		for(unsigned long i=0;i<x;i++){
			lock_guard<mutex> lk(m);
			counter++;					// this should be atomic or we should aquire lock
		}
	}
	unsigned long Get() const {return x;}
};
int main () {
	thread t4((Sample())); //this is to avoid what's known as C++'s most vexing parse: 
							// without the parentheses, the declaration is taken to be a declaration of a function called t4 
	thread t5=thread(Sample());
	thread t6(Sample(10));
	t6.join();
	t5.join();
	t4.join();
	std::cout<<counter<<std::endl;
	return 0;
}atomic<unsigned long> counter(0);
class Sample {
	unsigned long x;
	public:
	Sample(unsigned long x=10):x(x){}
	void operator () (){
		for(unsigned long i=0;i<x;i++){
			counter++;					// this should be atomic or we should aquire lock
		}
	}
	unsigned long Get() const {return x;}
};
int main () {
	thread t4((Sample())); //this is to avoid what's known as C++'s most vexing parse: 
							// without the parentheses, the declaration is taken to be a declaration of a function called t4 
	thread t5=thread(Sample());
	thread t6(Sample(10));
	t6.join();
	t5.join();
	t4.join();
	std::cout<<counter<<std::endl;
	return 0;
}void greeting(std::string const& message) {
    std::cout<<message<<std::endl;
}
int main() {
    thread t1(bind(greeting,"hi!"));
    thread t2(greeting,"hi!");
    t1.join();
    t2.join();
	return 0;
}class Sample {
	unsigned long x;
	public:
	Sample(unsigned long x=10):x(x){}
	void Inc (){ x+=20; }
	unsigned long Get() const {return x;}
};
void incref(int& x){
	x++;
}
void incSampleRef(Sample& obj){
	obj.Inc();
}
int main () {
	int x=10;
	Sample obj;
    std::cout<< x <<std::endl;
    std::cout<< obj.Get() <<std::endl;
	thread t1(incref,ref(x));
	thread t2(incSampleRef,ref(obj));
	t2.join();
	t1.join();
    std::cout<< x <<std::endl;
    std::cout<< obj.Get() <<std::endl;
	return 0;
}
class Sample {
	unsigned long x;
	public:
	Sample(unsigned long x=10):x(x){}
	void Inc (){ x+=20; }
	unsigned long Get() const {return x;}
};
int main () {
	{
		Sample obj;
		std::cout<<obj.Get()<<std::endl;
		thread t(bind(&Sample::Inc, &obj));
		t.join();
		std::cout<<obj.Get()<<std::endl;
	}
	{
		unique_ptr<Sample> p(new Sample);
	    std::cout<<p->Get()<<std::endl;
		thread t(bind(&Sample::Inc,p.get()));
		t.join();
	    std::cout<<p->Get()<<std::endl;
	}
	return 0;
}
compile with std=c++11 or std=c++98 alike :)
# g++ -std=c++98 -Iinclude -pthread test/basic.cpp
or
# g++ -std=c++11 -Iinclude -pthread test/basic.cpp