#include <iostream>

void g(int && v1, int & v2)
{
    std::cout << v1 << " " << ++v2 << std::endl;
}

template <typename F, typename T1, typename T2>
void flip(F f,T1 && t1, T2  && t2){
    g(t2, t1);
}

int main() {
	int i = 1, j = 1;
	
    g(12, i); // f changes i
	std::cout << "i = " << i << ", j = " << j << std::endl;
	
	flip(g, j, 2);
	std::cout << "i = " << i << ", j = " << j << std::endl;
	
	return 0;
}