-
+1
- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 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
// my __enable_if
template < typename T >
struct __Conflict {};
template <bool B, class T = void>
struct __enable_if { typedef __Conflict<T> type; };
template <class T>
struct __enable_if<true, T> { typedef T type; };
// Example of usage:
template <typename T>
class Lazy
{
public:
void _ctor(bool b);
void _ctor(typename __enable_if<!std::is_same<T, bool>::value, T>::type);
};
template <typename T>
void Lazy<T>::_ctor(bool b)
{
std::cout << "bool " << b << std::endl;
};
template <typename T>
void Lazy<T>::_ctor(typename __enable_if<!std::is_same<T, bool>::value, T>::type t)
{
std::cout << "T " << t << std::endl;
};
int main(int argc, char **argv)
{
Lazy<int> i;
i._ctor(10);
i._ctor(true);
Lazy<bool> b;
b._ctor(true);
return 0;
}
Наговнокодил свой собственный "enable_if" который круче стандартного и дает возможность писать класный говнокод
ASD_77,
29 Октября 2018
-
0
- 1
- 2
- 3
https://github.com/GSC-fake/Cossacks-back-to-war/blob/master/BackToWar_135/addon_2_project/ADDON_2_PROJECT/ADDON_PROJECT_130
Исходный код казаков. Трезвым лучше не читать. Я вас предупредил.
a1batross,
29 Октября 2018
-
0
- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 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
/*
https://habr.com/post/246009/
Это вторая статья в цикле «Теория категорий для программистов».
...
Я хотел бы сказать вам, что есть шаблон в стандартной библиотеке С++,
который принимает две функции и возвращает их композицию, но такого
нет.
Примечание переводчика: но такой не сложно написать на С++14 (я опускаю
тонны деталей владения и шаблонной магии для проверок, что эти функции
и тип аргумента действительно можно компоновать):
*/
template <typename T>
struct function_arg: public function_arg<decltype(&T::operator())> {};
template<typename ReturnType, typename Arg>
struct function_arg<ReturnType(Arg) const> {
using type = Arg;
};
template<typename ClassType, typename ReturnType, typename Arg>
struct function_arg<ReturnType(ClassType::*)(Arg) const> {
using type = Arg;
};
template<typename T>
using function_arg_t = typename function_arg<T>::type;
template<typename F, typename G>
auto compose(F&& f, G&& g) {
return [f = std::forward<F>(f), g = std::forward<G>(g)]
(function_arg_t<F>&& a) {return g(f(std::forward<function_arg_t<F>>(a)));};
}
Поэтому я за C++
j123123,
22 Октября 2018
-
0
- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
#include <iostream>
#include <tuple>
using namespace std;
int main() {
int a = 5, b = 6;
tie(a, b) = make_pair(b, a);
cout << a << " " << b << endl;
return 0;
}
https://ideone.com/9gzogv
guestinxo,
21 Октября 2018
-
+1
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
Что-то я давно не обсирал тут хуиту, которую пишут про
плюсы на хабре
https://habr.com/post/426965/
Идеального способа для обработки ошибок не существует.
До недавнего времени в С++ были почти все возможные
способы обработки ошибок кроме монад.
В этой замечательной статье забыли упомянуть setjmp/longjmp(std::longjmp если угодно), который хоть и из Си, но в C++ его никто не запрещал.
А еще signal (std::signal, если угодно), который хоть и из Си, но в C++ его никто не запрещал.
А еще goto (почему нет std::goto? Запилите быстраблядь!), который хоть и из Си, но в C++ его никто не запрещал.
А вообще, зачем иметь в языке такое количество говна в СТАНДАРТНОЙ БИБЛИОТЕКЕ для такой хуиты?
Вот еще в тему: https://video.twimg.com/tweet_video/De78Qn2XcAAQqfS.mp4
j123123,
20 Октября 2018
-
−1
- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
#include <new>
template <typename Lhs, typename Rhs>
auto replace(Lhs *lhs, Rhs) {
return *new (reinterpret_cast<void*>(lhs)) Rhs{};
}
int main() {
auto f1 = &add;
auto f2 = replace(add, [](int a, int b) { return a - b; });
f1(4, 2);
f2(4, 2);
}
Компилируется, не падает при запуске.
Elvenfighter,
16 Октября 2018
-
0
- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 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
void testing_dot(int N)
{
Vector_type<float> X(N), Y(N);
for (int i = 0; i < N; ++i)
{
X[i] = sin(i);
Y[i] = cos(i);
}
int Ntest = 20;
float taxpyseq = 0.0, t;
const float axpyflop = Ntest*Ntest*N * 3 * 1E-9;
printf("testing sequential ops:\n");
omp_set_num_threads(1);
for (int i = 0; i < Ntest; i++) {
t = omp_get_wtime();
for (int j = 0; j < Ntest; j++) dot(X, Y);
taxpyseq += omp_get_wtime() - t;
}
printf("Sequential ops timing: \n");
printf("dot time=%6.3fs GFLOPS=%6.2f\n", taxpyseq, axpyflop / taxpyseq);
//parallel mode
const int NTR = omp_get_num_procs();
for (int ntr = 2; ntr <= NTR; ntr += 2) {
for (int i = 0; i < N; ++i)
{
X[i] = sin(i);
Y[i] = cos(i);
}
printf("testing parallel ops for ntr=%d:\n", ntr);
omp_set_num_threads(ntr);
float taxpypar = 0.0;
for (int i = 0; i < Ntest; i++) {
t = omp_get_wtime();
for (int j = 0; j < Ntest; j++); dot(X, Y);//действительно небывалое ускорение!!!
taxpypar += omp_get_wtime() - t;
}
printf("dot time=%6.3fs GFLOPS=%6.2f Speedup=%6.2fX \n",
taxpypar, axpyflop / taxpypar, taxpyseq / taxpypar);
}
}
когда ты доказываешь закащику, что твой алгоритм реально лучше...
cat_code,
13 Октября 2018
-
0
- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
class MyClass
{
public:
MyClass() {};
MyClass(const MyClass & M1) {
MyClass * T = this;
delete this;
T = new MyClass(M1);
}
~MyClass() {};
private:
};
int main(int argc, char *argv[])
{
MyClass A1;
MyClass *B=new MyClass(A1);
}
ОНО РАБОТАЕТ!...вечно правда...НО ПОЧЕМУ ЭТА ТВАРЬ РАБОТАЕТ??? какого можно удалять память... ещё не выделенную... если кто мне объяснит, я буду счастлив (ах да код появился при решении одной забавной задачки, что произойдёт с конструктором копирования при удалении указателя на свой же экземпляр класса)
cat_code,
13 Октября 2018
-
0
- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
Vector_type(const Vector_type& m1) {
if (this->size != m1.size) {
if (this->size != 0)
destroy_memmory();
this->size = m1.size;
this->M = new m_type[size];
for (int i = 0; i < size; i++)
this->M[i] = m1.M[i];
}
else {
for (int i = 0; i < size; i++)
this->M[i] = m1.M[i];
}
};
Vector_type& operator = (const Vector_type& m1) {
if (this->size != m1.size)
throw "not right =";
this(m1);
return *this;
};
Действительно что могло пойти не так? просто копировать приравнять, копировать, приравнять, копировать...
cat_code,
12 Октября 2018
-
0
- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
Vector_type(const Vector_type& m1) {
if (this->size != m1.size) {
if (this->size != 0)
destroy_memmory();
this->size = m1.size;
this->M = new m_type[size];
for (int i = 0; i < size; i++)
this->M[i] = m1.M[i];
}
else {
for (int i = 0; i < size; i++)
this->M[i] = m1.M[i];
}
};
Vector_type& operator = (const Vector_type& m1) {
if (this->size != m1.size)
throw "not right =";
for (int i = 0; i < size; i++)
this->M[i] = m1.M[i];
return *this;
};
Действительно что могло пойти не так? просто копировать приравнять, копировать, приравнять, копировать...
cat_code,
12 Октября 2018