Форум программистов, компьютерный форум, киберфорум
Boost C++
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
18 / 18 / 4
Регистрация: 27.05.2013
Сообщений: 119
1

Как определить тип указателя shared_ptr<T>?

26.11.2015, 11:49. Просмотров 953. Ответов 2
Метки нет (Все метки)


Прошу не удалять, в с++ для начинающих не смогли мне ответить

есть классы:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
class char_int {
  public:
  char_int(int size):size_(size){
          first= new char [size]; second = new int [size];
  }
  ~char_int(){
         delete first; delete second;
  };
  int size_;
  char  *first;
  int *second;
};
 
class float_double {
  public:
  float_double(int size):size_(size){
          first= new float [size]; second = new double [size];
  }
  ~float_double(){
         delete first; delete second;
  };
  int size_;
  float  *first;
  double *second;
};
 
template<class T>
class TypeTMI_Ttype {
    public:
 
     ~TypeTMI_Ttype(){};
     TypeTMI_Ttype(int size):size_(size){
         data = boost::shared_ptr<T>(new T(size_));
     };
 
     T* get_data(void){return  data.get();}
 
     int size_;
     boost::shared_ptr<T>data;
    
};
как передать в некоторую функцию в качестве аргумента указатель на TypeTMI_Ttype:

C++
1
2
boost::shared_ptr< TypeTMI_Ttype <char_int> > cipdata(new TypeTMI_Ttype<char_int>(MAX));
boost::shared_ptr< TypeTMI_Ttype <float_double> > fpdata(new TypeTMI_Ttype<float_double>(MAX));;
и определить что в аргументе, boost::shared_ptr< TypeTMI_Ttype <char_int> > или
boost::shared_ptr< TypeTMI_Ttype <float_double> >
C++
1
2
3
4
5
6
7
8
9
10
foo ( boost::shared_ptr< TypeTMI_Ttype < ??????? > > ){
    
    if(char_int){//что то делать если boost::shared_ptr< TypeTMI_Ttype <char_int> >
    
   }
  
    if(float_double){//что то делать если boost::shared_ptr< TypeTMI_Ttype <float_double> >
   }
   
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
26.11.2015, 11:49
Ответы с готовыми решениями:

Как сделать *_cast указателя shared_ptr<T>?
Хочу определять тип (например через dynamic_cast) указателя shared_ptr. (криво звучит но по...

Презентация собственной реализации Разделяемого Указателя (shared_ptr)
Пришлось самому реализовывать эквивалентный shared_ptr класс, так как на винде стала повреждена...

Почему увеличение указателя на sizeof(тип) не тождественно инкременту этого же указателя?
Всем доброго дня.:) Можете обьяснить ,почему при инкриментировании указателя,его значение(адресс)...

Как изменить тип указателя массива ?
Например создаю массив: void * mass; if(1 == 1) mass = wchar_t; else mass = char; Пример...

2
1453 / 790 / 257
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
26.11.2015, 16:16 2
Ну примерно так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#include <iostream>
#include <type_traits>
#include <boost/shared_ptr.hpp>
#include <boost/current_function.hpp>
 
struct A {void fooA(){std::cout << BOOST_CURRENT_FUNCTION;}};
struct B {void fooB(){std::cout << BOOST_CURRENT_FUNCTION;}};
 
template <typename T>
struct C {T member;};
 
template <typename T,
          typename std::enable_if<std::is_same<T, A>::value>::type* = nullptr>
void foo_impl(boost::shared_ptr<C<T>> sp)
{
    sp->member.fooA();
}
 
template <typename T,
          typename std::enable_if<std::is_same<T, B>::value>::type* = nullptr>
void foo_impl(boost::shared_ptr<C<T>> sp)
{
    sp->member.fooB();
}
 
template <typename T>
void foo(boost::shared_ptr<C<T>> sp)
{
    foo_impl(sp);
}
 
int main()
{
    boost::shared_ptr<C<A>> ca(new C<A>());
    boost::shared_ptr<C<B>> cb(new C<B>());
 
    foo(ca);
    std::cout << "\n";
    foo(cb);
}
1
18 / 18 / 4
Регистрация: 27.05.2013
Сообщений: 119
26.11.2015, 17:31  [ТС] 3
DiffEreD,
Спасибо, вроде бы то что нужно.
сейчас буду тестиь для осознания.

я для своего примера выкрутился так
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
template<typename T>
void funk(T t){
  char_int *ci=NULL;
  float_double *fd=NULL;
  T t_;
  t_ = t;
 
  ci = dynamic_cast<char_int*>(t_->get_data());
  fd = dynamic_cast<float_double*>(t_->get_data());
}
 
boost::shared_ptr< TypeTMI_Ttype <char_int> > cipdata(new TypeTMI_Ttype<char_int>(MAX));
boost::shared_ptr< TypeTMI_Ttype <float_double> > fpdata(new TypeTMI_Ttype<float_double>(MAX));
 
funk(fpdata);
funk(cipdata);
Ваш пример выглядит красивее конечно.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
26.11.2015, 17:31

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь или здесь.

Как поменять тип данных у указателя?
Здравствуйте, уже часа 3 маюсь, все никак не могу поменять тип данных... это надо для отправки по...

Как привести тип умного указателя к указателю на void?
Изучаем WinAPI, необходимо выполнить задание: Написать программу, которая в одном потоке сохраняет...

Узнать тип значения, зная тип указателя
Здравствуйте! Есть такой код: template&lt;class Iter&gt; void func(Iter first, Iter last) { ...

9 строка. выражение должно иметь тип указателя на объект. как исправить?
#include &quot;pch.h&quot; #include &lt;iostream&gt; using namespace std; const int razm = 100; void z0(int...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.