#include <iostream>
#include <string>

using namespace std;

class Tank {
private:
    int maximalstand;
	int fuellstand;

public:
	Tank(int maximalstand) : maximalstand(maximalstand), fuellstand(maximalstand) {}

	void volltanken() {
		fuellstand=maximalstand;
	}

	void verbrauchen(int liter) {
		fuellstand-=liter;
		if(fuellstand < 0) {
			fuellstand=0;
			throw "Der Tank ist leer";
		}
	}
};

template<typename Config>
class TankProvider : public Config {
public:
	TankProvider(int liter) : Config(liter) {}
};

template<typename Next>
class TankProviderVolltanken : public Next {
public:
	TankProviderVolltanken(int liter) : Next(liter) {}
	void volltanken() {
		this->getTank().volltanken();
	}
};

template<typename Next>
class TankProviderVerbrauchen : public Next {
public:
	TankProviderVerbrauchen(int liter) : Next(liter) {}

	void verbrauchen(int liter) {
		this->getTank().verbrauchen(liter);
	}
};


template<typename Tank>
class TankProviderBase {
private:
	Tank impl;
protected:
	Tank& getTank() {
		return impl;
	}

	Tank const& getTank() const {
		return impl;
	}

	TankProviderBase(int maximalstand) : impl(maximalstand) {}
};

class Auto : public TankProvider<TankProviderVolltanken<TankProviderBase<Tank> > > {
private:

public:

	Auto() : TankProvider(75) { }

	void fahren(int km) {
		//pro 10km 1 liter
		int verbrauch = km/10;
		getTank().verbrauchen(verbrauch);
	}
};

int main() {
	Auto merzedes;

	merzedes.volltanken();
	try {
		while(1) {
			merzedes.fahren(10);
		}
	} catch(...) {
		cout<<"Tank leer\n";
	}
}