My apologies in advance if I'm not asking this in a right Stack Overflow forum. I'm trying to come up with a design which is easily expandable and also easy to use. So here is my problem:
In C++, I have two classes, called Class One and Class Two which both supports an operation called doSomething(T& data). T is a struct which for example has two members for Class One and has four members for Class Two. Since I want to enforce doSomething(T& data) into those classes, I have a base class called Base.
template <class T>
class Base
{
typedef T data_type;
virtual bool doSomething(data_type& data) const = 0;
};
struct OneData { int a; int b; };
class One : public Base<OneData>
{
bool doSomething(data_type& data) const { ... }
};
struct TwoData { int a; float b; int c; char d; };
class Two : public Base<TwoData>
{
bool doSomething(data_type& data) const { ... }
};
One big problem I have with this approach is, I cannot defined a Base type variable. I'm forced to use One or Two as type which forces me to defined 2 variables (what I really want is to create Base type variable and allocate memory or initialize it to One or Two based on the given T).
Furthermore, I was thinking to create class called OneTwo which defines doSomething(T& data) which basically hides the headache of which object to create from clients.
// This is just idea of what I want but don't know how??
template<class OneT, class TwoT>
struct OneTwo
{
bool doSomething(T& data) const // Here I don't know how to get to T
{
if (OneT::owns(data)) // call OneT::doSomething
else if (TwoT::owns(data)) // call TwoT::doSomething
else // Maybe exception, error, ...
}
};
I'm not sure even if I did right approach on class One and Two. Also, I tried to explain it as clear as possible but please ask if anyone need more information.
Please help me to understand on how to design this?
Thank you,
UPDATE:
In nutshell, I want to have minimum of 2 classes (class One and Two in above example) and possibly more that follow same interface such implement same operation (doSomething(...) in above example), but the given data to that operation is different for each class.
Moreover, I want to provide a single interface to all those classes classes (class OneTwo in above example) for ease of use.