Listing 2: The implementation of swap.

void swap(StrongStorage& other)
{
    using std::swap;

    if(other.cacheInitialized)
    {
        getOtherCache().template construct_as<value_type>(other.value());
    }
    try
    {
        if(cacheInitialized)
        {
            other.getOtherCache().template 
construct_as<value_type>(value());
        }
    }
    catch(...)
    {
        if(other.cacheInitialized)
        {
            getOtherCache().template destroy_as<value_type>();
        }
        throw;
    }
            
    if(cacheInitialized)
    {
        getCache().template destroy_as<value_type>();
    }
    if(other.cacheInitialized)
    {
        other.getCache().template destroy_as<value_type>();
    }
    useCache1=!useCache1;
    other.useCache1=!other.useCache1;
    swap(cacheInitialized,other.cacheInitialized);
}