#include <iostream>
#include <vector>
using namespace std;

class GenericData
{
};

class Data1 : public GenericData
{
};

class Data2 : public GenericData
{
};

class GenericComp
{
public:
	void process()
	{
		// inputs are check to make sure there number and order is correct
		// Use them to automatically call the correct function
		// What here ?
	}
	vector<GenericData> inputs;
};

class Comp1 : public GenericComp
{
public:
	void compute(Data1 input1, Data1 input2) { cout << "Comp1::compute(Data1 input1, Data1 input2)" << endl; }
	void compute(Data2 input1, Data2 input2) { cout << "Comp1::compute(Data2 input1, Data2 input2)" << endl; }
	void compute(Data1 input1, Data2 input2) { cout << "Comp1::compute(Data1 input1, Data2 input2)" << endl; }
};

class Comp2 : public GenericComp
{
public:
	void compute(Data1 input1) { cout << "Comp2::compute(Data1 input1)" << endl; }
	void compute(Data2 input1) { cout << "Comp2::compute(Data2 input1)" << endl; }
};

int main() {
	Data1 d1;	Data2 d2;
	Comp1 c1; Comp2 c2;
	
	c1.inputs = { d1, d1 };
	c1.process(); 			// "Comp1::compute(Data1 input1, Data1 input2)"
	
	c1.inputs = { d2, d2 };
	c1.process(); 			// "Comp1::compute(Data2 input1, Data2 input2)"
	
	c1.inputs = { d1, d2 };
	c1.process(); 			// "Comp1::compute(Data1 input1, Data2 input2)"

	vector<GenericComp> comps = { c1, c2 };
	for (comp : comps)
	{
		comp.process();
	}
	return 0;
}