Простейшие пример решения, используя Strategy шаблон (однако, это не имеет значения, является ли это время компиляции или во время, выбранное):
class BaseStrategy
{
public:
virtual void doStuff() = 0;
};
class Strategy1 : public Base
{
public:
void doStuff();
};
class Strategy2 : public Base
{
public:
void doStuff();
};
class SomeKindOfAMainClass
{
public:
SomeKindOfAMainClass(BaseStrategy* s)
{
this->s = s;
}
void doStuff()
{
s->doStuff();
}
private:
BaseStrategy* s;
};
, а затем вы просто делаете либо new SomeKindOfAMainClass(new Strategy1())
, либо new SomeKindOfAMainClass(new Strategy2())
.
Простой пример черты:
struct WithStrategy1 {};
struct WithStrategy2 {};
template<typename T>
class SomeKindOfAMainClass;
template<>
class SomeKindOfAMainClass<WithStrategy1>
{
//use Strategy1 here
};
template<>
class SomeKindOfAMainClass<WithStrategy2>
{
//use Strategy2 here
};
И вы просто либо экземпляр SomeKindOfAMainClass<WithStrategy1>
или SomeKindOfAMainClass<WithStrategy2>
в начале программы.
Или у вас может быть решение от Omaha с #ifdef
.
Нет шаблон проектирования, необходимый если вы хотите решить во время компиляции. Просто создайте экземпляр нужной реализации. Если вы хотите, чтобы это было сделано путем переключения некоторых «настроек» в исходном файле, вы можете использовать простой шаблон (или ifdef для стиля 'C'). – BartoszKP
Won 't шаблон будет решаться во время выполнения? мог бы привести пример (я согласен с этим в качестве ответа). – nbubis
C++ шаблоны являются объектами времени компиляции. – Omaha