class Defer {
public:
Defer(std::function<void()> callback)
: callback_(callback)
{}
~Defer() {
callback_();
}
private:
std::function<void()> callback_;
};
void bar() {
throw std::exception();
}
void foo() {
Defer defer([] () {
std::cout << "Exiting" << std::endl;
});
...
if (...) {
return; // prints "Exiting"
}
...
if (...) {
bar(); // prints "Exiting"
}
...
// prints "Exiting"
}
class MyAny
{
public:
MyAny()
: placeHolder_(nullptr)
{}
~MyAny()
{
delete placeHolder_;
}
template<typename T> void set(const T& data)
{
if (placeHolder_ != nullptr)
{
static_cast<Holder<T>*>(placeHolder_)->setData(data);
}
else
{
placeHolder_ = new Holder<T>(data);
}
}
template<typename T> T get() const
{
return static_cast<Holder<T>*>(placeHolder_)->getData();
}
private:
class PlaceHolder
{
};
template<class T>
class Holder : public PlaceHolder
{
public:
Holder(const T& data)
: data_(data)
{}
void setData(const T& data)
{
data_ = data;
}
T getData() const
{
return data_;
}
private:
T data_;
};
PlaceHolder* placeHolder_;
};
int main()
{
MyAny myData;
myData.set<std::string>("ciao");
std::cout << myData.get<std::string>() << std::endl; // prints "ciao"
myData.set<int>(10);
std::cout << myData.get<int>() << std::endl; // prints "10"
std::cout << myData.get<double>() << std::endl; // dangerous!! Prints garbage
return 0;
}