Войти
ФлеймФорумПрограммирование

c++ шаблонство. узнать тип в compile time

Страницы: 1 2 Следующая »
#0
21:11, 16 фев. 2013
class Base
{};

class Child0 : public Base
{};

class Child1 : public Base
{};

class Child2 : public Base
{};
//и т.д.

void mysave(const Base* b)
{ // мой код
}

template <typename T>
void save(const T& val)
{
  // Fundamental Types - сохраняем одним способом

  // если T - это тип (Base*) или один из его наследников: void mysave(const Base* b)
}


void sample()
{
  // сохраняем стандартным способом:
  save(int(0));
  save(double(0));

  // сохраняем нашим способом
  Child0* sampleChild0 = new Child0();
  save(sampleChild0);
  Base* sampleBase = new Base();
  save(sampleBase);
}

нужно в compile time определить, если T - это (Base*) или его наследник, то должна вызываться функция
void mysave(const Base* b)


#1
21:12, 16 фев. 2013

в run time это сделать в принципе можно, интересует, есть ли у кого идеи , как это сделать в compile time

#2
21:19, 16 фев. 2013

Мне кажется, или это просто специализация шаблона?

#3
21:28, 16 фев. 2013

MarkoPolo
и да и нет, сложность в том, что у Base может быть ~200 классов-наследников, все ручками не перечислишь)

#4
21:38, 16 фев. 2013

Kotofey
используй перегрузку функции mysave, люк

#5
22:22, 16 фев. 2013

Либо специализация шаблона, либо сделать для всех классов общий интерфейс с виртуальным методом mysave, и в каждом классе перегружать его как надо.

#6
22:39, 16 фев. 2013

http://liveworkspace.org/code/rwrBc$26

+ Показать

а ещё лучше написать 2 таких класса на будущее
+ Показать

#7
22:44, 16 фев. 2013

Mephi1984
> виртуальным методом mysave,
satan claws
> используй перегрузку функции mysave, люк
Ему в компил тайме надо же.

#8
22:49, 16 фев. 2013

MarkoPolo
http://www.boost.org/doc/libs/1_53_0/libs/type_traits/doc/html/bo… _base_of.html

аналог вручную показал Chaos_Optima
способов в компайл тайм хватает

edit: почему я за перегрузку - все видели, как перегрузкой operator << класс может описать, каким конкретно образом он умеет себя вывести в поток? не вижу разницы в поставленной автором задаче

#9
23:07, 16 фев. 2013

MarkoPolo
> > используй перегрузку функции mysave, люк
> Ему в компил тайме надо же.
а перегрузка с каких пор не компил тайм?

#10
23:11, 16 фев. 2013

cNoNim
Если перегруженная фигня не будет виртуальной, то фиг когда она будет работать нормально с указателями, а если она виртуальная, то в каком месте она компил тайм?

Или я не понял, что имеется в виду.

#11
23:12, 16 фев. 2013

Kotofey
> и да и нет, сложность в том, что у Base может быть ~200 классов-наследников,
> все ручками не перечислишь)
Ничего себе! 200 классов-наследников. И все они на одном уровне? Какая-то волшебная архитектура.

#12
23:15, 16 фев. 2013

MarkoPolo
мы действительно говорим о перегрузке функций?

void foo(int a);
void foo(double a);
MarkoPolo
> то фиг когда она будет работать нормально с указателями
а не раскажешь с помощью какой магии указатель на класс наследник можно привести к указателю на базовый класс?
#13
0:29, 17 фев. 2013

MarkoPolo
> Если перегруженная фигня не будет виртуальной, то фиг когда она будет работать
> нормально с указателями, а если она виртуальная, то в каком месте она компил
> тайм?
бред несёшь. И походу путаешь перегрузку и переопределение.

#14
2:58, 17 фев. 2013

Chaos_Optima
>template <class dest,class src>
>class CanConvert

в общем-то вин)


MarkoPolo
вполне обычная архитектура, на мой взгляд. Base выступает в качестве аналога Object, все остальные классы от него понаследованы)


satan claws
спс за ссылку на бустовский аналог)

Страницы: 1 2 Следующая »
ФлеймФорумПрограммирование

Тема в архиве.