Как передать параметры шаблона в CRTP?
======================================

В следующем коде:

Как мне написать CRPTInt, чтобы я мог передать шаблонизированный параметр, который затем будет продолжен в определении Derived?

Спасибо,

Джим

**static polymorphism** и способность**mixin** (параметризованное) поведение. Чтобы проиллюстрировать две альтернативы, удобно сначала определить общий шаблон

Затем вы определяете шаблон интерфейса класса для типа поведения, который вы хотите

Чтобы получить разные реализации этого интерфейса, просто определите разные классы, каждый из которых является производным`FooInterface` с самим собой**curiously recurring template parameters**: 

Альтернативой является параметризация различных реализаций интерфейса. На этот раз шаблон класса зависит от**template-template parameter** и не типовой параметр

Реализация - это еще один шаблон класса, который наследуется от интерфейса с самим собой и параметром не-типа в качестве аргументов.

Вот как вы их называете:

Классы в вашем вопросе не вполне вписываются в эту общую схему. Если вы можете дать`Derived` какое-то CRTP-подобное поведение, то вы можете сделать

**UPDATE**: На основе обсуждения из<https://stackoverflow.com/a/11571808/819272>Я обнаружил, что исходный ответ скомпилирован только в Visual Studio 2010, но не в gcc из-за некоторых непереносимых функций, характерных для Microsoft. Например.`self()` функция от`enable_down_cast` является (шаблоном) зависимым именем в своих производных классах, и, следовательно, не видимо без явного`using` директивы. Кроме того, я добавил дефолтных деструкторов с правильным уровнем защиты. Наконец, я переименовал свой оригинальный класс`enable_crtp` в`enable_down_cast` потому что это именно то, что он делает: вручную включает статический полиморфизм, что компилятор делает автоматически для динамического полиморфизма.