#include <functional>
#include <iostream>

template<typename T, typename Setter>
class Option
{
public:
    Option()
		: setter_(Setter)
	{
	}

	/* operator= to be done, ruft dann setter mit value_ als value-Parameter auf */
	/* noch irgendwas, um intValue_ oder doubleValue_ direkt verwenden zu können */

private:
	T value_;
	std::function<bool(const T &source, T &value)> setter_;
};

class SomeClass
{
public:
	void Blub()
	{
		intValue_ = 20;
		doubleValue_ = 4.2;
	}

	void HighlyFrequentedFunction()
	{
		std::cout << "Result is: " << (intValue_ * doubleValue_) << "\n";
	}

private:
	Option<int, [] (const int &source, int &value) -> bool {
		value = source;
		return true;
	}> intValue_;
	
	Option<double, [] (const double &source, double &value) -> bool {
		if (source < 2.0 || source > 5.0) return false;
		value = source * 2;
		return true;
	}> doubleValue_;
};

int mai(int argc, char *argv[])
{
	SomeClass test;
	test.Blub();

	for (int i = 0; i < 20; ++i) test.HighlyFrequentedFunction();

	return 0;
}