#include <iostream>
#include <typeinfo>
using namespace std;
 
template <class T>
struct traitFoo: public T {
	traitFoo():T(){}
	virtual ~traitFoo(){}
	virtual void foo()
	{ 
		cout << typeid(this).name() << " " << typeid(T).name() << " foo" << endl;
		cout << this->i << endl; // Раскомментируйте для боли - всё ок
	}
};

struct baseStruct {};
template <typename T>
struct withi : baseStruct {T i;};
struct bar : public withi<int>{};
struct baz : public withi<float>{};

int main() {
	using BarFoo = traitFoo<bar>;
	using BazFoo = traitFoo<baz>;
 
	BarFoo rfoo;
	rfoo.i = 1.5;
	BazFoo zfoo;
	zfoo.i = 1.5;
	rfoo.foo();
	zfoo.foo();
	
	// Как сюда дабавить хранение BarFoo и BazFoo в общем массиве? - вроде норм
	baseStruct arr[2] = { rfoo, zfoo };

	return 0;
}