#include <tuple>
#include <utility>
template< typename... DataMembers >
class SwapMethodProvider
{
public:
inline void Swap( SwapMethodProvider& other );
private:
std::tuple< DataMembers... > member_dataMembers;
};
template< typename... DataMembers >
inline void SwapMethodProvider< DataMembers... >::Swap( SwapMethodProvider& other )
{
// Swap between the tuples that contain the data members
std::swap( member_dataMembers, other.member_dataMembers );
}
class ExtraSauce : public SwapMethodProvider< int, double >
{};
class EvenMoreExtraSauce : public ExtraSauce, public SwapMethodProvider< std::string >
{};
int main(){}
I2luY2x1ZGUgPHR1cGxlPgojaW5jbHVkZSA8dXRpbGl0eT4KCnRlbXBsYXRlPCB0eXBlbmFtZS4uLiBEYXRhTWVtYmVycyA+IApjbGFzcyBTd2FwTWV0aG9kUHJvdmlkZXIKewpwdWJsaWM6CgogICAgaW5saW5lIHZvaWQgU3dhcCggU3dhcE1ldGhvZFByb3ZpZGVyJiBvdGhlciApOwoKcHJpdmF0ZToKCiAgICBzdGQ6OnR1cGxlPCBEYXRhTWVtYmVycy4uLiA+IG1lbWJlcl9kYXRhTWVtYmVyczsKCn07Cgp0ZW1wbGF0ZTwgdHlwZW5hbWUuLi4gRGF0YU1lbWJlcnMgPgppbmxpbmUgdm9pZCBTd2FwTWV0aG9kUHJvdmlkZXI8IERhdGFNZW1iZXJzLi4uID46OlN3YXAoIFN3YXBNZXRob2RQcm92aWRlciYgb3RoZXIgKQp7CiAgICAvLyBTd2FwIGJldHdlZW4gdGhlIHR1cGxlcyB0aGF0IGNvbnRhaW4gdGhlIGRhdGEgbWVtYmVycwogICAgc3RkOjpzd2FwKCBtZW1iZXJfZGF0YU1lbWJlcnMsIG90aGVyLm1lbWJlcl9kYXRhTWVtYmVycyApOwp9CgpjbGFzcyBFeHRyYVNhdWNlIDogcHVibGljIFN3YXBNZXRob2RQcm92aWRlcjwgaW50LCBkb3VibGUgPgp7fTsKCmNsYXNzIEV2ZW5Nb3JlRXh0cmFTYXVjZSA6IHB1YmxpYyBFeHRyYVNhdWNlLCBwdWJsaWMgU3dhcE1ldGhvZFByb3ZpZGVyPCBzdGQ6OnN0cmluZyA+Cnt9OwoKaW50IG1haW4oKXt9