Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 02.02.2013, 10:07   #1
sversus
Пользователь
 
Регистрация: 08.12.2012
Сообщений: 17
По умолчанию как определять тип данных

у меня есть шаблонный класс:

PHP код:
template <class _Elem>
class 
Element
{
private:
    
_Elem *elem;
    
Element *next, *prev;

public:
    
Element()
    {
        
elem = new _Elem;
        
next prev NULL;
    }
    
Element(_Elem *ele)
    {
        
next prev NULL;
        
elem = new _Elem;
        *
elem = *ele;
    }
    ~
Element()
    {
        
delete elem;
    }

    
_Elem GetElem()
    {
        return 
elem;
    }

    
friend class List;
}; 
я хочу определить тип данных _Elem, если это будет например строка, мне надо будет выделить массив char и записать данные в elem

Последний раз редактировалось sversus; 02.02.2013 в 10:16. Причина: поправил описание
sversus вне форума Ответить с цитированием
Старый 02.02.2013, 10:34   #2
sversus
Пользователь
 
Регистрация: 08.12.2012
Сообщений: 17
По умолчанию

отбой, всё поправил, такой должен был быть конструктор
PHP код:
Element(_Elem *ele)
{
    
next prev NULL;
    if(
typeid(ele) == typeid(char*))
    {
        
int len strlen(reinterpret_cast<char*>(ele));
        
elem = new _Elem[len];
        for(
int i 0leni++)
        {
            *(
elem i) = *(ele i);
        }
        *(
elem len) = '\0';
    }
    else
    {
        
elem = new _Elem;
        *
elem = *ele;
    }

sversus вне форума Ответить с цитированием
Старый 04.02.2013, 12:26   #3
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Цитата:
отбой, всё поправил, такой должен был быть конструктор
Нет, не такой. Если _Elem есть MyClass, для которого не существует operator=(char), код не скомпилируется (компилятор не сможет преобразовать выражение *(elem + len) = '\0').
Надо (только в данном отношении, ничего не говорю про остальной код) - так:
Код:
template <class _Elem>
class Element
{
private:
    _Elem *elem;
    Element *next, *prev;

public:
    Element()
    {
        elem = new _Elem;
        next = prev = NULL;
    }
    Element(_Elem *ele)
    {
        next = prev = NULL;
        elem = new _Elem;
        *elem = *ele;
    }
    ~Element()
    {
        delete elem;
    }

    _Elem GetElem()
    {
        return elem;
    }

    friend class List;
};  

template <> //Специализация шаблона для случая _Elem=char
class Element<char>
{
private:
    char *elem;
    Element *next, *prev;

public:
    Element()
    {
        elem = new char;
        next = prev = NULL;
    }
    Element(char *ele)
    {
        next = prev = NULL;
        int len = strlen(ele);
        elem = new char[len];
        for(int i = 0; i < len; i++)
        {
            *(elem + i) = *(ele + i);
        }
        *(elem + len) = '\0';
    }
    ~Element()
    {
        delete elem;
    }

    char GetElem()
    {
        return elem;
    }

    friend class List;
};
Abstraction вне форума Ответить с цитированием
Старый 04.02.2013, 14:29   #4
Perchik71
С++, Delphi
Форумчанин
 
Аватар для Perchik71
 
Регистрация: 24.11.2012
Сообщений: 495
По умолчанию

typeid крутая вещь, но это вызывает RTTI =( а это я не особо люблю(
Если помог, тут весы есть , Вам не сложно, а мне приятно.
Perchik71 вне форума Ответить с цитированием
Старый 04.02.2013, 18:45   #5
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,618
По умолчанию

Цитата:
я хочу определить тип данных _Elem, если это будет например строка, мне надо будет выделить массив char и записать данные в elem
Вопрос не совсем ясен.
Если у тебя есть Element<int> someName; и ты хочешь проверить тип элемента в someName - то тебе поможет что-то типа dynamic_cast.

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

------------

а вот, специализацию Abstraction написал вроде бы, я не заметил.

Последний раз редактировалось rrrFer; 04.02.2013 в 18:46. Причина: добавил
rrrFer вне форума Ответить с цитированием
Старый 04.02.2013, 19:02   #6
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,618
По умолчанию

Но у Abstraction зачем то код дублируется, этого можно избежать если использовать специализацию шаблона метода. Написал пример:
Код:
#include <iostream>
template<typename T>
class Foo {
  T value_;
public:
  Foo(T value);
};

template<typename T>
Foo<T>::Foo(T value)
  :value_(value) {
  std::cout << 1;
}

template<>
Foo<char>::Foo(char value) 
  :value_(value) {
    std::cout << 2;
}


int main() {
  Foo<int> a(1);
  Foo<char> b('2');
  Foo<float> c(3.14f);
  return 0;
}
rrrFer вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как указать тип данных получаемых из TextBox PAMAC Microsoft Office Excel 2 08.11.2012 08:51
Как создать тип данных? zgest Общие вопросы C/C++ 10 26.03.2009 01:24
В Access есть тип данных "Счетчик".Есть ли подобный тип данных в MS Sql Server 2000? An_ton SQL, базы данных 5 16.01.2009 17:55
Как мне создать свой тип данных PilGrim Общие вопросы .NET 1 05.11.2008 19:12
как правильно поставить тип данных? RedWolf Помощь студентам 4 29.12.2007 11:18