I'm usually just doing something like this (written from memory and simplified; so might contain errors):
std::map<const std::string, std::unique_ptr<sf::Texture> > texstorage; // this stores all textures
sf::Texture &getTexture(const char *file) {
std::map<const std::string, std::unique_ptr<sf::Texture> >::iterator a = texstorage.find(file);
if (a != texstorage.end()) // texture has been loaded before
return *a->second->get(); // return the old texture
sf::Texture *tex = new sf::Texture(); // create a new texture
tex->loadFromFile(file); // load the image
texstorage.insert(std::make_pair(file, std::unique_ptr<sf::Texture>(tex))); // save it for later
return *tex; // return the new texture
}
Just make sure to empty the map before your context is destroyed.