Шаблонные классы C ++ и конструкция копирования - PullRequest
5 голосов
/ 04 апреля 2010

Можно ли как-нибудь построить новый объект из данного объекта, если параметры шаблона обоих объектов идентичны во время выполнения? Например:

У меня есть шаблон класса с объявлением:

template<typename _Type1, typename _Type2> class Object;

Далее у меня есть два экземпляра шаблона:

template class Object<char, int>;
template class Object<wchar_t, wint_t>;

Теперь я хочу написать функцию-член, такую ​​как:

template<typename _Type1, typename _Type2>
Object<char, int> Object<_Type1, _Type2>::toCharObject() {
    if(__gnu_cxx::__are_same<_Type1, char>::__value)
        return *this;
    else {
        //Perform some kind of conversion and return an Object<char, int>
    }
}

Я попробовал несколько методов, таких как использование __gnu_cxx::__enable_if<__gnu_cxx::__are_same<_Type1, char>::__value, _Type1>::__type в конструкторе копирования для класса Oject, но я продолжаю сталкиваться с ошибкой:

error: conversion from ‘Object<wchar_t, wint_t>’ to non-scalar type ‘Object<char, int>’ requested

Нет ли способа, которым я могу это сделать? Любая помощь будет принята с благодарностью!

1 Ответ

4 голосов
/ 04 апреля 2010

Что у вас должно работать, проблема в том, что компилятор выполняет проверку типа для части return *this, даже если типы не равны (отсюда ошибка компиляции).Просто используйте return (Object<char, int>)(*this);, и все будет в порядке - единственный раз, когда код будет выполняться, когда типы все равно одинаковы, поэтому приведение ничего не делает, кроме как обойти ошибку компиляции.Вы можете использовать специализацию шаблона:

template <class _Type1, class _Type2>
Object<char, int> toCharObject(Object<_Type1, _Type2> obj)
{
  // Do conversion and return
}

// Specialisation when types are equal
template <>
Object<char, int> toCharObject(Object<char, int> obj)
{
  return obj;
}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...