Форум программистов, компьютерный форум CyberForum.ru

shared_ptr и реализация семантики переноса - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Сколько таких действий надо произвести, чтобы получился нуль? (подпрограммы) http://www.cyberforum.ru/cpp-beginners/thread745529.html
Из заданного числа вычли сумму его цифр. Из результата вновь вычли сумму его цифр и т.д. Сколько таких действий надо произвести, чтобы получился нуль? Сумму цифр нужно подсчитать с помощью подпрограммы.
C++ Описать класс с именем ORDER Всем привет, ребята помогите решить задачку. Пропустил лекции теперь не знаю как ее делать. Описать класс с именем ORDER, содержащий поля: - расчетный счет плательщика; - расчетный счет получателя; - перечисляемая сумма в руб. Написать программу, выполняющую следующие действия: - ввод с клавиатуры данных класса типа ZNAK; - вывод на экран информации о сумме, снятой с расчетного счета... http://www.cyberforum.ru/cpp-beginners/thread745510.html
C++ Какие переменные используются в программе? (шифровка и расшифровка текста методом решетки)
Какие переменные используются в программе?Это программа шифровки и расшифровки текста методом решетки #include "stdafx.h" #include <iostream> #include "conio.h" using namespace std; int N; void RotationMatrix(int **MatrixKey);//поворот решетки
Написать функцию замены всех цифр в строке пробелами C++
Помогите пожалуйста написать программу, очень срочно надо Написать функцию замены всех цифр в строке пробелами. Ввести и обработать две смешанные строки(вводятся английские буквы и цифры). Строки вводятся с клавиатуры
C++ Базовый класс Complex и производный класс Vector http://www.cyberforum.ru/cpp-beginners/thread745463.html
Создайте базовый класс Complex (комплексное число) для реализации комплексных чисел в алгебраической форме и основных операций с ними: сложения, вычитания, умножения и деления. Создайте производный класс для реализации векторов с комплексными компонентами (вектор имеет три компонента, каждый компонент – комплексное число). Компоненты вектора являются элементами массива. Предусмотреть возможность...
C++ Алгоритм по типу экселевского vlookup. Посоветуйте, как скомпоновать 2 файлика Hi all. Думаю, как лучше сделать следующее (понятно, что можно в Excel'е через vlookup, а как программно?) в общем, есть колонка данных в одном файле: 101 : name1 102 : name2 103 : name3 104 : name4 105 : name5 подробнее

Показать сообщение отдельно
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
25.12.2012, 18:21     shared_ptr и реализация семантики переноса
Как вариант, не особо красиво конечно)
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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
#include <iostream>
#include <memory>
#include <utility>
#include <algorithm>
#include <iterator>
#include <type_traits>
#include <initializer_list>
 
 
template<typename T>
class array {
   
public:
   typedef array           self_type;
   typedef T               value_type;
   typedef T *             pointer;
   typedef T const*        const_pointer;
   typedef T &             reference;
   typedef T const&        const_reference;
   typedef std::size_t     size_type;
   typedef std::ptrdiff_t  difference_type;
   typedef const_pointer   iterator;
   typedef const_pointer   const_iterator;
   
   
   const_iterator begin() const {
      return arrayPtr.get();
   }
   
   const_iterator end() const {
      return arrayPtr.get() + arraySize;
   }
   
   
   const_reference operator [](size_type const idx) const {
      return arrayPtr[idx];
   }
   
   
   size_type size() const {
      return arraySize;
   }
   
   
   void swap(self_type & other) {
      std::swap(arrayPtr,  other.arrayPtr);
      std::swap(arraySize, other.ArraySize);
   }
   
   
   explicit array(size_type const s = 0, const_reference v = T())
         : arrayPtr(new T[s], std::default_delete<T[]>())
         , arraySize(s) {
      std::fill(&*arrayPtr, &*arrayPtr + arraySize, v);      
   }
         
   template<typename Iterator>
   array(Iterator const first, Iterator const last)
         : arraySize(std::distance(first, last)) {
      arrayPtr.reset(new T[arraySize], std::default_delete<T[]>());
      std::copy(first, last, &*arrayPtr);
   }
   
   template<
         typename S
       , typename = typename std::enable_if<std::is_convertible<S, T>::value>::type
   >
   array(std::initializer_list<S> list)
         : array(std::begin(list), std::end(list)) {}
   
   array(self_type const& other)
         : arrayPtr(other.arrayPtr)
         , arraySize(other.arraySize) {}
   
   template<
         typename S
       , typename = typename std::enable_if<std::is_convertible<S, T>::value>::type
   >
   array(array<S> const& other)
         : array(other.begin(), other.end()) {}
      
   array(self_type && other)
         : arrayPtr(std::move(other.arrayPtr))
         , arraySize(other.arraySize) {}
           
   
   array & operator =(array const&) = delete;
   array & operator =(array &&)     = delete;
            
  
private:
   template<typename S>
   friend class array;
   
   template<typename S, typename L>
   array<typename std::common_type<S, L>::type>
   friend operator +(array<S> const& lhs, array<L> const& rhs);
   
 
   std::shared_ptr<T>   arrayPtr;
   size_type            arraySize;
};
 
 
template<typename T, typename S>
array<typename std::common_type<T, S>::type>
operator +(array<T> const& lhs, array<S> const& rhs) {
   using result_type = typename std::common_type<T, S>::type;
   
   array<result_type> result(std::max(lhs.size(), rhs.size()));
   
   if (lhs.size() < rhs.size()) {
      std::copy(rhs.begin(), rhs.end(), &*result.arrayPtr);
      std::transform(lhs.begin(), lhs.end(), rhs.begin(), &*result.arrayPtr, std::plus<result_type>());
   } else {
      std::copy(lhs.begin(), lhs.end(), &*result.arrayPtr);
      std::transform(rhs.begin(), rhs.end(), lhs.begin(), &*result.arrayPtr, std::plus<result_type>());
   }
   
   return result;
}
 
 
int main() {
   array<int>     a1 = {1, 2, 3, 4, 5};
   array<double>  a2 = {1.23, 432., 5.66, 5.56};
   array<int>     b1(a1);
   array<double>  b2(a2);
   array<float>   b3(a1);
   
   auto r1 = a1 + b1;
   std::copy(std::begin(r1), std::end(r1), std::ostream_iterator<int>(std::cout, " "));
   std::cout << std::endl;
   
   auto r2 = a1 + a2;
   std::copy(std::begin(r2), std::end(r2), std::ostream_iterator<double>(std::cout, " "));
   std::cout << std::endl;
   
   auto r3 = b1 + b2 + b3;
   std::copy(std::begin(r3), std::end(r3), std::ostream_iterator<double>(std::cout, " "));
   std::cout << std::endl;
   
   auto r4 = std::move(r3);
   std::copy(std::begin(r4), std::end(r4), std::ostream_iterator<double>(std::cout, " "));
   std::cout << std::endl;
}
 
Текущее время: 02:50. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru