Re: Alternatives to using virtuals for cross-platform development
greek_bill wrote:
Hi,
I'm interested in developing an application that needs to run on more
than one operating system. Naturally, a lot of the code will be shared
between the various OSs, with OS specific functionality being kept
separate.
....
template<class OSImp>
class BaseFoo
{
public: void Bar() { static_cast<OSImp*>(this)->Bar(); }
};
class MyFavOSFoo : public BaseFoo<MyFavOSFoo>
{
public: void Bar() { // do some OS specific stuff }
public: void OSFunc() { // some OS-specific interface }
private: //store some OS specific data
}
Now this is more like what I want, I can have multiple
implementations, without any run-time overhead.
There are a couple of problems however (otherwise I wouldn't be here,
would I? :)
....
Many thanks,
Bill
I have used template specializations for this sort of thing (tested):
#include <iostream>
using namespace std;
enum { OS1, OS2 };
// configuration (in a system-wide header someplace)
const int OS = OS2; // or give -D to the compiler from make, or whatever
template<int> class OSClass;
template<> class OSClass<OS1> {
public: void Bar() { cout << "os1.Bar()" << endl; }
public: void OSFunc() { /* some OS1-specific interface */ }
private: //store some OS1 specific data
};
template<> class OSClass<OS2> {
public: void Bar() { cout << "os2.Bar()" << endl; m_os1.Bar(); }
public: void OSFunc() { /* some OS2-specific interface */ }
private: //store some OS2 specific data
OSClass<OS1> m_os1; // use OS1 stuff in secret.
};
// Application code
int main (void)
{
OSClass<OS> os;
os.Bar();
}
You could add an abstract base class for both if you want the compiler
to check that both have the proper interface.