Я хотел бы прокомментировать эту идею дизайна шаблона, с которой я играю - PullRequest
1 голос
/ 26 марта 2011

Я преподавал программирование игр и провел много времени, рассказывая о нарушении зависимостей с целью, чтобы старый код не изменился, если будет введен новый код. Мы настраивали объект рендеринга, и я решил шаблонизировать функцию рендеринга, чтобы показать некоторые варианты использования классов признаков и т. Д. Но это привело к интересной идее.

Если я никогда не предоставляю универсальное тело и предоставляю только полную специализацию, класс рендеринга может быть расширен в зависимости от того, что он может визуализировать из внешнего кода, и если рендерится объект, который не имеет полной специализации, произойдет сбой компилятора вместо выполнения , Это дает играм, использующим эту систему, возможность создавать настраиваемые объекты для рендеринга и расширять функциональность, не изменяя файлы рендеринга hpp или cpp.

Это известный шаблон проектирования, или это ужасная идея и почему, или кто-то еще сделал это? Я хотел бы знать, есть ли здесь серьезная проблема, потому что все, что я вижу, является положительными.

Спасибо всем.

Вот форматированный код.

Я делаю это немного по-другому, поэтому клиентский код не знает, что это шаблон.

class Renderer
{
public:
    void SwapBuffers();

    template<typename RenderObj>
    void Render(const RenderObj&);
};

// Full specializations
class Sprite;
template<> void Renderer::Render<Sprite>(const Sprite&);

1 Ответ

1 голос
/ 26 марта 2011

Если я правильно понимаю ваше описание:

template <class> class render; // undefined

template <>
class render<Object1>
{
   // ...
};

template <>
class render<Object2>
{
   // ...
};

// ...

Я считаю это правильным подходом.Иногда вы можете заполнить основной шаблон основного случая, а иногда нет.И ошибка времени компиляции, указывающая, когда вы не можете, превосходит ошибку времени выполнения (как вы сказали).

Я бы сказал, что шаблон проектирования известен, хотя я не могу присвоить ему имя,std :: function в C ++ 11 следует похожему шаблону, хотя клиенты обычно не предоставляют специализацию (хотя теоретически могли бы):

template <class> class function; // undefined

template<class R, class... ArgTypes>
class function<R(ArgTypes...)>
{
  // ...
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...