Я часто использую политики в своем коде, и обычно я очень доволен этим.
Но время от времени я сталкиваюсь с использованием этого шаблона в ситуациях, когда выбираются политики и время выполнения, и у меня появляются привычки для обхода таких ситуаций. Обычно я начинаю с чего-то такого:
class DrawArrays {
protected:
void sendDraw() const;
};
class DrawElements {
public:
void setIndices( GLenum mode, GLsizei count, GLenum type, const GLvoid *indices);
protected:
void sendDraw() const;
};
template<class Policy>
class Vertices : public Policy {
using Policy::sendDraw();
public:
void render() const;
};
Когда политика выбирается во время выполнения, у меня есть разные варианты обхода ситуации.
Различные пути кода:
if(drawElements) {
Vertices<DrawElements> vertices;
} else {
Vertices<DrawArrays> vertices;
}
Наследование и виртуальные вызовы:
class PureVertices {
public:
void render()=0;
};
template<class Policy>
class Vertices : public PureVertices, public Policy {
//..
};
Оба решения кажутся мне неправильными. Первый создает бесполезный беспорядок, а второй - накладные расходы на виртуальные вызовы, которых я пытался избежать, используя политики в первую очередь.
Мне не хватает правильных решений или я использую неправильный шаблон для решения проблемы?