У меня есть std::vector
-подобный класс, скомпилированный с Visual C ++ 2008. В этом классе есть часть, где перемещаются сохраненные элементы - либо тело перераспределяется, либо выполняется вставка / частичное удаление.Теперь некоторые типы могут быть просто memmove()
d, в то время как другие должны быть сконструированы с копией в новом местоположении, а затем уничтожены в исходном местоположении.
В настоящее время есть шаблонная функция, которая реализует «копирование-конструирование, затем уничтожение»."и есть специализация для каждого типа, которая может быть memmove()
d.Я хотел бы использовать V isual C ++ 2008 поддержку черт типа , чтобы упростить эту задачу.
Я хочу, чтобы для каждого POD memmove()
выбирался автоматически.Я не возражаю, если некоторые типы, которые могут быть memmove()
d, перемещаются с использованием этой шаблонной функции, но я не могу допустить противоположную ситуацию - когда тип данных, который не может быть memmove()
d, равен memmove()
d.
Похоже, что встроенный __is_pod()
подойдет, но MSDN сообщает, что возвращает false
для встроенных типов.Так что я думаю, мне нужно также использовать __is_class()
для первой фильтрации не классов.
Так что я думаю, что подойдет следующее:
if( !__is_class(T) ) { // not a struct and not a class - built-in type
//memmove()
} else if( __is_pod(T) ) { // is a struct or a class and is a POD
//memmove()
} else { // is a struct or a class and is not a POD
//DefaultMoveViaCopy()
}
Будет ли мое решение работать нормально?