Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / C++ Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 2 [3] 4 5 6   вперед  Ctrl      все
 Re: Пятничная шабонная магия  [new]
CEMb
Member

Откуда: public T{};
Сообщений: 1958
Anatoly Moskovsky
т.е. делать свой парсер строки? Ну вот не хотелось этого делать. Строковый поток отлично справляется с этими задачи, кроме одного момента про, собственно, саму строку.
Сейчас пробую сделать через SFINAE.
18 янв 18, 05:24    [21115255]     Ответить | Цитировать Сообщить модератору
 Re: Пятничная шабонная магия  [new]
CEMb
Member

Откуда: public T{};
Сообщений: 1958
такой вопрос:

есть иерархия классов, для простоты:

class A
{
	type_A a_;
public:
	const type_A& Get() const { return a_; }
};

class B : public A
{
	type_B b_;
public:
	const type_B& Get() const { return b_; }
};

class C : public B
{
	type_C c_;
public:
	const type_C& Get() const { return c_; }
};


на самом деле это один класс-шаблон, я расписал в иерархию, чтобы было нагляднее
вопрос: есть ли способ написать метод Get, чтобы оно работало, как написано выше? Чтобы возвращал значение то, которое запрашивается? Именно через возвращаемое значение. Имя должно метода должно быть одинаковое (потому что это один класс).
Через шаблонный метод у меня не получилось, потому что при несовпадении типа метода-шаблона(TE) и класса шаблона(T1) компилятор ругается на несовместимость возвращаемого значения, хотя реально его никогда возвращать не будет:

template <typename TE> auto Class<T1, TS...>::Get(tstring& name) -> shared_ptr<TE>
{
	if (is_same<TE, T1>::value)
		return value_; // here
	else
		return Class<TS...>::Get<TE>(name);
}
25 янв 18, 12:51    [21137941]     Ответить | Цитировать Сообщить модератору
 Re: Пятничная шабонная магия  [new]
rdb_dev
Member

Откуда: с болот
Сообщений: 3061
CEMb,
typedef const char type_A;
typedef const short type_B;
typedef const int type_C;

class C 
{
public:

  struct __Get;

private:

  type_A a_ = 0x0a;
  type_B b_ = 0x0b;
  type_C c_ = 0x0c;
  
  friend struct __Get;

public:

  struct __Get
  {
  private:

    operator const C& () const
    {
      register size_t offset = reinterpret_cast<size_t>(&((C*)0)->Get);
      return *reinterpret_cast<const C*>((size_t)this - offset);
    }

  public:

    operator type_A& () const
    {
      return ((const C&)*this).a_;
    }
    
    operator type_B& () const
    {
      return ((const C&)*this).b_;
    }

    operator type_C& () const
    {
      return ((const C&)*this).c_;
    }
    
  }
  Get;
};

#pragma argsused
int __cdecl main(int argc, char* argv[])
{
  C c;
  type_A& i = c.Get;
  type_B& j = c.Get;
  type_C& k = c.Get;
  .
  .
  .
  return 0;
}
25 янв 18, 15:37    [21138815]     Ответить | Цитировать Сообщить модератору
 Re: Пятничная шабонная магия  [new]
CEMb
Member

Откуда: public T{};
Сообщений: 1958
rdb_dev, интересная идея, спасибо. Я так понял, что даже без структуры Get, просто с кастами оно тоже работать будет?
Но вот typedef у меня не получится применить, так как набор типов в объекте заранее неизвестен, это шаблон, на каждом объекте набор типов определяется параметрами шаблона. Но вот с кастами надо попробовать, спасибо.
26 янв 18, 05:46    [21140177]     Ответить | Цитировать Сообщить модератору
 Re: Пятничная шабонная магия  [new]
a guest
Guest
((C*)0)->Get

UB
9 мар 18, 18:41    [21246273]     Ответить | Цитировать Сообщить модератору
 Re: Пятничная шабонная магия  [new]
CEMb
Member

Откуда: public T{};
Сообщений: 1958
можно как-то в качестве параметра шаблона использовать формулу?

что-то типа
temlate<typename F> int Do (int a, int b)
{
return F(a, b);
}


А без лябмд?
31 мар 18, 11:42    [21301666]     Ответить | Цитировать Сообщить модератору
 Re: Пятничная шабонная магия  [new]
CEMb
Member

Откуда: public T{};
Сообщений: 1958
CEMb
можно как-то в качестве параметра шаблона использовать формулу?

Можно использовать класс, в котором использовать (статическую) функцию с нужной сигнатурой.
Но вот если у меня F очень плотно используется? Буквально, хочу в одном месте a+b, а в другом a-2*b, например. И таких штук 10-20, не хочется под всё классы городить, и дорого это по производительности.

Ну а с лямбдами-то это можно сделать?
31 мар 18, 11:45    [21301671]     Ответить | Цитировать Сообщить модератору
 Re: Пятничная шабонная магия  [new]
CEMb
Member

Откуда: public T{};
Сообщений: 1958
CEMb
Буквально, хочу в одном месте a+b, а в другом a-2*b, например.
инлайнами и опциями компилятора у меня таки это получилось
31 мар 18, 21:58    [21302221]     Ответить | Цитировать Сообщить модератору
 Re: Пятничная шабонная магия  [new]
White Owl
Member

Откуда:
Сообщений: 12418
CEMb
CEMb
можно как-то в качестве параметра шаблона использовать формулу?

Можно использовать класс, в котором использовать (статическую) функцию с нужной сигнатурой.
Но вот если у меня F очень плотно используется? Буквально, хочу в одном месте a+b, а в другом a-2*b, например. И таких штук 10-20, не хочется под всё классы городить, и дорого это по производительности.

Ну а с лямбдами-то это можно сделать?


template <typename T, typename L>
T do_lambda(T a, T b, L func) {
    return func(a, b);
}

do_lamda(1, 2, [](int a, int b){return (a+b);});
2 апр 18, 18:58    [21306377]     Ответить | Цитировать Сообщить модератору
 Re: Пятничная шабонная магия  [new]
CEMb
Member

Откуда: public T{};
Сообщений: 1958
White Owl
да, отлично, даже без inline код встраивается без вызова! Жаль только что у меня проект в 2010, там лямбд нету.

Отдельно порадовал оптимизатор, к примеру do_lamda(rand(), 1, ...) сводится в результате к инкременту. Ну и вообще без rand и проверки возвращаемого значения не удалось собрать, так как оптимизатор не видел смысла в этом коде, просто выкидывал его из релиза
3 апр 18, 06:05    [21306783]     Ответить | Цитировать Сообщить модератору
 Re: Пятничная шабонная магия  [new]
rdb_dev
Member

Откуда: с болот
Сообщений: 3061
a guest
((C*)0)->Get
UB
И что же тут неопределённого для LE?
3 апр 18, 11:19    [21307511]     Ответить | Цитировать Сообщить модератору
 Re: Пятничная шабонная магия  [new]
a guest
Member

Откуда:
Сообщений: 154
rdb_dev
a guest
((C*)0)->Get
UB
И что же тут неопределённого для LE?
Что такое "LE"? Little Endian?
3 апр 18, 11:26    [21307541]     Ответить | Цитировать Сообщить модератору
 Re: Пятничная шабонная магия  [new]
rdb_dev
Member

Откуда: с болот
Сообщений: 3061
a guest, да.
3 апр 18, 11:58    [21307730]     Ответить | Цитировать Сообщить модератору
 Re: Пятничная шабонная магия  [new]
a guest
Member

Откуда:
Сообщений: 154
rdb_dev, не понимаю, при чём тут вообще endianness.
null pointer не указывает ни на какой объект, поэтому возможность получать доступ к data member-у сомнительна.
3 апр 18, 12:11    [21307772]     Ответить | Цитировать Сообщить модератору
 Re: Пятничная шабонная магия  [new]
rdb_dev
Member

Откуда: с болот
Сообщений: 3061
a guest
rdb_dev, не понимаю, при чём тут вообще endianness.
null pointer не указывает ни на какой объект, поэтому возможность получать доступ к data member-у сомнительна.
А где ты видишь доступ к члену экземпляра класса по нулевому указателю?
operator const C& () const
{
  register size_t offset = reinterpret_cast<size_t>(&((C*)0)->Get);
  return *reinterpret_cast<const C*>((size_t)this - offset);
}
Это банальный расчёт смещения члена внутри структуры экземпляра класса, чтобы инкапсулированный объект мог получить указатель на инкапсулирующий.
3 апр 18, 13:10    [21308019]     Ответить | Цитировать Сообщить модератору
 Re: Пятничная шабонная магия  [new]
a guest
Member

Откуда:
Сообщений: 154
rdb_dev
a guest
rdb_dev, не понимаю, при чём тут вообще endianness.
null pointer не указывает ни на какой объект, поэтому возможность получать доступ к data member-у сомнительна.
А где ты видишь доступ к члену экземпляра класса по нулевому указателю?
Здесь:
((C*)0)->Get

rdb_dev
operator const C& () const
{
  register size_t offset = reinterpret_cast<size_t>(&((C*)0)->Get);
  return *reinterpret_cast<const C*>((size_t)this - offset);
}
Это банальный расчёт смещения члена внутри структуры экземпляра класса, чтобы инкапсулированный объект мог получить указатель на инкапсулирующий.
Который всего лишь приводит к
https://wandbox.org/permlink/uf0utxeaF4023z0u
prog.cc:29:58: runtime error: member access within null pointer of type 'C'
:D
3 апр 18, 13:15    [21308043]     Ответить | Цитировать Сообщить модератору
 Re: Пятничная шабонная магия  [new]
rdb_dev
Member

Откуда: с болот
Сообщений: 3061
a guest
rdb_dev
пропущено...
А где ты видишь доступ к члену экземпляра класса по нулевому указателю?
Здесь: [src c++]
((C*)0)->Get
Еще раз повторяю - в моём нет доступа к члену объекта по нулевому указателю - нет ни чтения структуры, ни вызова функции. Учите C++ ABI !
3 апр 18, 13:25    [21308085]     Ответить | Цитировать Сообщить модератору
 Re: Пятничная шабонная магия  [new]
a guest
Member

Откуда:
Сообщений: 154
rdb_dev
a guest
пропущено...
Здесь: [src c++]
((C*)0)->Get
Еще раз повторяю - в моём нет доступа к члену объекта по нулевому указателю - нет ни чтения структуры, ни вызова функции. Учите C++ ABI !
prog.cc:29:58: runtime error: member access within null pointer of type 'C'
3 апр 18, 13:28    [21308106]     Ответить | Цитировать Сообщить модератору
 Re: Пятничная шабонная магия  [new]
a guest
Member

Откуда:
Сообщений: 154
((const C&)*this).a_;

UB
((const C&)*this).b_;

UB
((const C&)*this).c_;

UB
3 апр 18, 13:35    [21308147]     Ответить | Цитировать Сообщить модератору
 Re: Пятничная шабонная магия  [new]
rdb_dev
Member

Откуда: с болот
Сообщений: 3061
a guest, еще и с перегрузкой операторов приведения типа не знаком?
Собрать на g++ и пройтись отладчиком - не судьба?
3 апр 18, 13:53    [21308212]     Ответить | Цитировать Сообщить модератору
 Re: Пятничная шабонная магия  [new]
a guest
Member

Откуда:
Сообщений: 154
rdb_dev, ой-ой. Извените. Оператор приведения типа же определён.

Который весь сплошь из УГ UB состоит. Даже если заменить
reinterpret_cast<size_t>(&((C*)0)->Get)
на offsetof (который до C++17 для данного класса был UB, а теперь "conditionally supported") и он будет supported в данной реализации, то арифметика "указателей" там — останется UB.
3 апр 18, 13:59    [21308241]     Ответить | Цитировать Сообщить модератору
 Re: Пятничная шабонная магия  [new]
a guest
Member

Откуда:
Сообщений: 154
rdb_dev
Собрать на g++ и пройтись отладчиком - не судьба?
Принести сюда цитат из стандарта, которые покажут, что код ­валиден — не судьба?
3 апр 18, 14:00    [21308243]     Ответить | Цитировать Сообщить модератору
 Re: Пятничная шабонная магия  [new]
rdb_dev
Member

Откуда: с болот
Сообщений: 3061
a guest, еще раз - где здесь доступ к члену экземпляра класса (чтение свойства/вызов метода) по нулевому указателю экземпляра?
operator const C& () const
{
  register size_t offset = reinterpret_cast<size_t>(&((C*)0)->Get);
  return *reinterpret_cast<const C*>((size_t)this - offset);
}

"&((C*)0)->Get" - это что? Амперсанд (взятие адреса) видим?
3 апр 18, 14:03    [21308263]     Ответить | Цитировать Сообщить модератору
 Re: Пятничная шабонная магия  [new]
rdb_dev
Member

Откуда: с болот
Сообщений: 3061
a guest
rdb_dev
Собрать на g++ и пройтись отладчиком - не судьба?
Принести сюда цитат из стандарта, которые покажут, что код ­валиден — не судьба?
Этот код валиден даже для структур чистого Си. Открывай раздел ABI стандарта и читай!
3 апр 18, 14:05    [21308277]     Ответить | Цитировать Сообщить модератору
 Re: Пятничная шабонная магия  [new]
a guest
Member

Откуда:
Сообщений: 154
rdb_dev
Открывай раздел ABI стандарта и читай!
Что-то не найду в http://eel.is/c draft/ раздел "ABI".
3 апр 18, 14:48    [21308560]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 2 [3] 4 5 6   вперед  Ctrl      все
Все форумы / C++ Ответить