Как обнаружить перемещаемые по битам типы, используя черты типа в Visual C ++ 9? - PullRequest
2 голосов
/ 09 ноября 2011

У меня есть 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()
}

Будет ли мое решение работать нормально?

1 Ответ

1 голос
/ 09 ноября 2011

Использование boost_if enable_if:

template <typename T, class Enabler = void>
struct SmartCopy
{
    static void apply(const T& obj, T* dest)
    {
        // Generic copy...
    }
}

template <typename T>
struct SmartCopy<T, typename boost::enable_if_c<__is_pod(T) || !__is_class(T)>::type >
{
    static void apply(const T& obj, T* dest)
    {
        // memmove version...
    }
}

template <typename T>
void smart_move(const T& obj, T* dest)
{
    SmartCopy<T>::apply(obj, dest);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...