У меня есть класс (Voxel
) с подклассами, который может иметь или не иметь несколько различных свойств (материал, плотность и т. Д.) С помощью методов get и set. Теперь я хочу, чтобы написать код следующим образом:Преимущества характеристик типа против статических элементов?
template <typename VoxelType>
void process(VoxelType voxel)
{
if(VOXEL_HAS_MATERIAL)
{
//Do some work which involves calling get/setMaterial()
}
if(VOXEL_HAS_DENSITY)
{
//Do some work which involves calling get/setDensity()
}
}
Поэтому я бы хотел реализовать VOXEL_HAS_MATERIAL
и VOXEL_HAS_DENSITY
частей. Два простых варианта:
- Добавить статические
hasMaterial()
иhasDensity()
методы кVoxel
класса, должны быть переопределены в производных классах. - Создайте класс черт типа с
hasMaterial()
иhasDensity()
и специализируйте его для каждого подклассаVoxel
.
Использование метода (2) позволяет определять признаки для примитивных типов (int и т. Д.), Но это не полезно в моем случае. Существуют ли какие-либо дополнительные преимущества для использования признаков типа здесь или я должен использовать более простой метод статического метода?
Примечание: Я также знаю подходы, основанные на SFINAE, которые я буду рассматривать отдельно.
Редактировать 1: Я изменил образец кода, чтобы показать использование шаблонов. Я ищу статические, а не временные решения этой проблемы. В идеале, компилятор сможет отключить код в операторах if, если он определяет, что они не могут быть выполнены для данного типа.
"пустота процесса (Voxel вокселя)" - вы имеете в виду "SomeVoxelSubclass вокселя"? – Abyx
Что значит «статические методы, подлежащие переопределению в производных классах»? –
Спасибо за комментарии. Я действительно использую шаблоны и обновил образец кода, чтобы отразить это. Не хотел вводить в заблуждение, я просто немного упростил код :-) – PolyVox