Войти
ПроектыФорумСобираю команду

Life is Feudal Sandbox MMORPG. Ищем тестировщика. (40 стр)

Advanced: Тема повышенной сложности или важная.

Страницы: 139 40 41 42 43 Следующая »
#585
20:39, 10 окт. 2014

bazhenovc
Спасибо большое!

Я сам много чего на плюсах знаю, но с этим еще никогда не сталкивался.)

Имеет практическое применение, так что смысл есть:

Можно привязать какой-нибудь член класса к этому указателю и получить доступ к члену извне. (Возможно можно даже мониторить и изменять приватные члены)


#586
21:07, 10 окт. 2014

San4es
От подобных вещей практическая польза только одна - демонстрировать свои заоблачные навыки впечатлительным блондинкам:)

На практике за использование подобных "фичей" надо отрывать руки - потому что оно нечитаемо для 99% программистов.

#587
21:11, 10 окт. 2014

bazhenovc
> На практике за использование подобных "фичей" надо отрывать руки
Я уж сижу молчу, что про статику подумал, чтобы еще бОльшим дурачком не показаться. Оказывается всё ок :)

#588
21:44, 10 окт. 2014

bazhenovc
Погоди есть прикольное применение.
Ты ведь знаешь про статический полиморфизм?
Еще одно проявление статического полиморфизма можно сотворить:

"передача в функцию указания"
void EditData(DATA *edata, unsigned char DATA::*field)
{
    for(int i = 0; i < NUM; i++)
    {
        edata.*field = 255;
    }
}

//.....
EditData(data, &DATA::x1);
EditData(data, &DATA::x2);

ссылка  http://www.cyberforum.ru/cpp-beginners/thread1272129.html#post6700795

а нечитаемых штук в C++ и так больше 100500 в бусте и STL'е, да еще плюс всякие лямбды с замыканиями, например.

#589
21:49, 10 окт. 2014

San4es
Странное понимание статического полиморфизма. Я всегда думал, что это контракты, compile-time metadata и прочие кошерные вещи:)

#590
22:13, 10 окт. 2014

bazhenovc
в эту функцию можно любое поле типа int засунуть.
А если сделать функцию шаблонной о двух параметрах, то и любой агрегирующий объект любого типа и любое поле любого типа можно передать. Чем не контракт?

А вот контрактная функция, принимающая указание

template<class T, class U>
void EditData( T *edata, U T::*field, const U& value )
{
for(int i = 0; i < NUM; i++)
{
edata.*field = value;
}
}

Инициализирует поля всех экземпляров типа T в массиве значением value

Применение:
DATA *datas = new DATA[NUM];
EditData< DATA, string >( datas, &DATA::x1, string("1234") );

Контракт заключается в том, что T содержит поле типа U

#591
22:36, 10 окт. 2014

San4es
Это контракт "наоборот". Правильные контракты и статический полиморфизм должны выглядеть следующим образом:

struct Data
{
    int field0;
    int field1;
};

template <typename T>
void EditData(T* data, str_const member)
{
    static_assert(std::contract::require_member<T, member>::type, "Given type has no member " + member);

    static_if(std::contract::require_member<T, member>::type) {
        T::*member = 255;
    }
}

Вместо этого мы имеем обьявления указателей на члены класса, на методы, на функции и кучу бесполезного говна.
Полностью обобщённый require_member реализовать невозможно, приходится городить что-то типа такого:

template <typename T>
class HasMetaClass
{
private:
  template <typename U, U>
  class Check { };

  template <typename C>
  static char F(Check<DK::Class<T>*, &C::metaClass>*);

  template <typename C>
  static long F(...);

public:
  enum
  {
    Result = (sizeof(F<T>(0)) == sizeof(char))
  };
};

static_if тоже нельзя сделать, вместо него:

template <typename T, bool>
struct Retainer;

template <typename T>
struct Retainer<T, true>
{
  static inline void Retain(T* ptr, bool)  { /*ptr->Retain();*/ }
  static inline void Release(T* ptr, bool) { /*ptr->Release();*/ }
};

template <typename T>
struct Retainer<T, false>
{
  static inline void Retain(T* ptr, bool)  { (void)ptr; }
  static inline void Release(T* ptr, bool) { delete ptr; }
};

Использование которого ещё более жуткое:

Retainer<T, HasMetaClass<T>::Result>::Retain(objPtr, std::is_base_of<DK::ReferenceCountedObject, T>::value);
Retainer<T, HasMetaClass<T>::Result>::Release(objPtr, std::is_base_of<DK::ReferenceCountedObject, T>::value);

У тебя получилось сходу понять код, написанный выше? Большинство сдаётся, когда видит SFINAE в HasMetaClass :)
Мало кто доходит до использования Retainer в качестве static_if.

А задача на самом деле очень простая - нужно было сделать обобщённый код, который бы управлял временем жизни объектов внутри биндинга к скриптам.
Если надо сделать что-то более сложное во время компиляции - код превращается в полный адЪ.

Поэтому int S::*member, при полном отсутствии в языке вменяемых средств для метапрограммирования, абсолютно никакой ценности не представляет.

#592
22:57, 10 окт. 2014

bazhenovc
Честно - не получилось.
Я разве похож на человека у которого фамилия Александреску?
Чудо обобщенного программирования))

Закроем тему про плюсы, а то ругаются люди?

#593
23:19, 10 окт. 2014

тема превратилась в тему про плюсы xD
надо сказать что читать стало сложнее(для меня), но интереснее и познавательнее...

#594
4:38, 11 окт. 2014

> А сколько, если не секрет?
Bishop, не секрет. Он реально очень (я бы даже сказал, что излишне) короткий, порядка 20-25 мсек, но мы ещё пока тюним, так что всё может измениться.

#595
19:09, 1 апр. 2015

Сегодня выкатили патч с новым революционным режимом улучшенной графики "Improved Graphics Mode" (c):

Запустить видео по клику - Как делать игрыЗапустить видео по клику - Как делать игры
#596
20:50, 1 апр. 2015

Крутой проект!

#597
0:31, 2 апр. 2015

Достали протухший проект из гробика? :)

#598
7:14, 2 апр. 2015

Почему протухший?
На Стиме мне он все время выпадает.

Цену только задрали до небес: была тысяча, сделали полторы.
Бобик, если бы вы ее по 400-500 руб. продавали, я бы купил. А так слишком дорого.
Я за это время купил Grav, Savage Lands и Reign of Kings. И все это в совокупности дешевле LiF.
Savage Lands многообещающая.

#599
10:12, 2 апр. 2015

Ciaphas
> Почему протухший?

Все по той же причине :)

Изображение

> На Стиме мне он все время выпадает.
> Цену только задрали до небес: была тысяча, сделали полторы.
> Бобик, если бы вы ее по 400-500 руб. продавали, я бы купил. А так слишком
> дорого.
> Я за это время купил Grav, Savage Lands и Reign of Kings. И все это в
> совокупности дешевле LiF.
> Savage Lands многообещающая.

А если бы мы ее бесплатно раздавали, вот бы народу то было :)
Ради интереса, и сколько времени вы наиграли в сумме в эти три игры? По опыту общения с игроками на выставках и по девелоперской статистике на стиме в нашу игру играют сотнями часов. Люди реально живут у нас, потому и Life is Feudal.
Пока этот чел из штатов держит рекорд (2000 часов на момент написания этого поста):  http://steamcommunity.com/profiles/76561198052492832

Моя мысль о том, что можно накупить кучу игр, которые надоедят через пару часов, а можно купить одну и надолго и она того стоит ;)

Анекдот немного в тему:

Нашел лев на улице 50 руб. и решил исполнить мечту своей жизни - посетить
бордель. Приходит он туда и спрашивает сутенершу:
- А можно у вас заказать тигрицу?
- Да, конечно. 200 руб час
- А сколько будет стоить пантера? - спрашивает лев
- 150 руб. час.
Лев в раздумьях: денег то не хватает.
- Хорошо, а если леопардиху заказать?
- 100 руб час!- отвечает сутенерша.
- А у вас есть кто-нибудь на 50 руб.? -задает вопрос лев
- Конечно есть! Мышки-девственницы- 5 руб. пучок!!

Страницы: 139 40 41 42 43 Следующая »
ПроектыФорумСобираю команду

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