Шаблонные классы C++ и конструкция копии

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

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

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

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

5
задан themoondothshine 4 April 2010 в 16:03
поделиться

1 ответ

То, что у вас должно работать, проблема в том, что компилятор выполняет проверку типа в части return * this , даже если типы не равны (отсюда ошибка компиляции). Просто используйте return (Object ) (* 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;
}

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

4
ответ дан 15 December 2019 в 00:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: