By the way, if you don't want to reinvent the wheel, take a look at my implementation in Thor.Animation (http://www.bromeon.ch/libraries/thor/v2.0/doc/group___animation.html) :)
// Define animation with two frames and their relative durations 1 and 2
thor::FrameAnimation animation;
animation.addFrame(1.f, sf::IntRect(...));
animation.addFrame(2.f, sf::IntRect(...));
// Either directly animate a sprite
sf::Sprite sprite;
animation(sprite, progress);
// Or use animator for convenience
thor::Animator<sf::Sprite, std::string> animator;
animator.addAnimation("walk", animation, sf::seconds(3.f));
animator.playAnimation("walk");
...
animator.update(frameTime);
animator.animate(sprite);
Having frames with different sizes is no problem, just specify it at thor::FrameAnimation.