HLFX.Ru Forum Страницы (3): « 1 2 [3]
Показать все 44 сообщений этой темы на одной странице

HLFX.Ru Forum (https://hlfx.ru/forum/index.php)
- Технические вопросы (https://hlfx.ru/forum/forumdisplay.php?forumid=20)
-- спор (https://hlfx.ru/forum/showthread.php?threadid=4164)


Отправлено XaeroX 15-11-2013 в 12:44:

Цитата:
thambs писал:
в общем виде нереализуемо

Я не буду претендовать на красивые решения (над ними можно думать долго), но вот по-быстрому сделал общее решение:

C++ Source Code:
1
template<typename T,int unused>
2
class valueHolder {
3
public:
4
  valueHolder( T value ) : data( value ) {}
5
  operator T () { return data; }
6
private:
7
  T data;
8
};
9
 
10
template<typename T>
11
class quadraticValue {
12
public:
13
  quadraticValue( T value ) : data( value ) {}
14
  quadraticValue<T> operator +( quadraticValue<T> &other ) { return data + other.data; }
15
private:
16
  T data;
17
};
18
 
19
template<typename T>
20
class linearValue {
21
public:
22
  linearValue( T value ) : data( value ) {}
23
  linearValue<T> operator +( linearValue<T> &other ) { return linearValue<T>( data + other.data ); }
24
  quadraticValue<T> operator *( linearValue<T> &other ) { return quadraticValue<T>( data * other.data ); }
25
private:
26
  T data;
27
};
28
 
29
typedef linearValue<valueHolder<float,1>> distance_t;
30
typedef quadraticValue<valueHolder<float,1>> area_t;
31
 
32
typedef linearValue<valueHolder<float,2>> weight_t;
33
typedef quadraticValue<valueHolder<float,2>> squaredWeight_t;
34
 
35
void foo( void )
36
{
37
  // компилится
38
  distance_t d1 = 1.0f;
39
  distance_t d2 = 2.0f;
40
  area_t a = d1 * d2;
41
 
42
  // компилится
43
  weight_t w1 = 1.0f;
44
  weight_t w2 = 2.0f;
45
  squaredWeight_t sw = w1 * w2;
46
 
47
  // не компилится
48
  area_t a2 = w1 * w2;
49
  squaredWeight_t a3 = d1 * d2;
50
}

__________________

xaerox on Vivino


Отправлено thambs 15-11-2013 в 12:57:

XaeroX

не получится, ты ж не можешь произвольные сочетания distance^x weight^y time^z делать. о, во -- смотри что нашёл -- вроде в буусте такое есть http://www.boost.org/doc/libs/1_54_...imensionExample

__________________
http://www.moddb.com/mods/monorail-quest


Отправлено XaeroX 15-11-2013 в 13:00:

Да я знаю, что в буусте есть.
Я говорю о том, что если как следует подумать, можно и самому на шаблонах это реализовать.

__________________

xaerox on Vivino


Отправлено thambs 15-11-2013 в 13:39:

XaeroX

ну шаблоны да, расовая штука, тут не поспоришь. жаль у меня у меня таки не было времени свою софтину на плюсах переписать, а то б эти буустовские штуки заюзал -- меньше б плюх лепил.

__________________
http://www.moddb.com/mods/monorail-quest


Отправлено Дядя Миша 15-11-2013 в 15:35:

Цитата:
XaeroX писал:
Если же красота кода мало заботит, то goto - прекрасный оператор для выхода из цикла любой вложенности. При этом этот оператор соответствует нативным машинным командам, т.е. не является сколько-нибудь вычислительно затратным.

Я даже больше скажу. Именно поэтому от нас её всячески прячут и нерекомендуют использовать, поскольку goto ломает к чертям все слои абстракции. Особенно на С++. На Си еще небольшая беда, если вы из функции выпрыгнете. А если из приватного члена класса?

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'


Отправлено thambs 15-11-2013 в 16:08:

Дядя Миша
ну вот мне и странно было, что через такую жопу надо делать..

в фортране это красиво сделали:

C++ Source Code:
1
outer: do i=1,100
2
inner: do j=1,1000
3
exit outer
4
enddo inner
5
enddo outer

так, в принципе, можно не только из циклов, но и из ifов и selectов выходить. по моему, очень удобно, меня несколько шокировало то, что в c-языках такой конструкции нет.

блин и ведь так всегда, в одном языке одни расовые вещи, а другом другие, а так что бы сразу всё -- хрен там.

__________________
http://www.moddb.com/mods/monorail-quest


Отправлено XaeroX 15-11-2013 в 16:41:

thambs
То, что ты описал на фортране, как раз и решается с помощью goto.
Есть ещё вариант с sentinel цикла:

C++ Source Code:
1
bool sentinel = true;
2
for ( int i = 0; i < 100 && sentinel; ++i )
3
  for ( int j = 0; j < 1000 && sentinel; ++j ) {
4
    sentinel = false; break;
5
  }
6
}

__________________

xaerox on Vivino


Отправлено PomanoB 15-11-2013 в 17:27:

Такое есть в JavaScript и, кажется, в джаве, выход по break и continue из вложенных циклов.
Но я боюсь, что со мной будет, если признаюсь в склонности к JavaScript'у


Отправлено nemyax 15-11-2013 в 19:21:

А что в C++ с каррированием и паттерн-матчингом, которые есть в демотиваторе? Тоже на шаблонах?


Отправлено XaeroX 15-11-2013 в 19:31:

nemyax
Каррирование на шаблонах, а паттерн-матчинг - ну, в принципе, тоже можно на них, но вроде бы можно и просто с помощью наследования реализовать. Или даже с помощью typeid.

__________________

xaerox on Vivino


Отправлено nemyax 15-11-2013 в 19:32:

Цитата:
XaeroX писал:
Каррирование на шаблонах

Как это в коде хоть выглядит? =)


Отправлено XaeroX 15-11-2013 в 19:34:

Но вообще говоря С++ - не функциональный язык.
То есть, лично я люблю элементы функциональщины (и шаблоны), но в меру. Мне важна императивная составляющая и возможность комбинировать подходы. Это плюсы позволяют идеально.

Добавлено 16-11-2013 в 02:34:

Цитата:
nemyax писал:
Как это в коде хоть выглядит? =)

Бинды из STL в качестве простой иллюстрации подойдут?

__________________

xaerox on Vivino


Отправлено nemyax 15-11-2013 в 19:41:

Цитата:
XaeroX писал:
Бинды из STL

Это получается полноценное частичное применение с канпеляцией промежуточных функций?


Отправлено XaeroX 16-11-2013 в 10:10:

nemyax
Пожалуй, да - только частично-применёнными будут не функции, а функторы (но это без разницы). Только это всё compile-time фичи, компилируется потом всё вместе.

Кстати, нашёл тут в википедии, что луа поддерживает замыкания (синтаксис такой же как у похапе), а вот петон, судя по всему, нет.

__________________

xaerox on Vivino


Временная зона GMT. Текущее время 08:41. Страницы (3): « 1 2 [3]
Показать все 44 сообщений этой темы на одной странице

На основе vBulletin версии 2.3.0
Авторское право © Jelsoft Enterprises Limited 2000 - 2002.
Дизайн и программирование: Crystice Softworks © 2005 - 2024