Войти
ПрограммированиеФорумОбщее

C++ отложенное изменение свойств объекта в цепочке вызовов, независимо от порядка вызовов методов в цепочке

Страницы: 1 2 3 Следующая »
#0
(Правка: 8:31) 8:29, 8 апр. 2019

Всем привет.

Некий абстрактный пример:

class Dancer
{
public:
  Dancer & Dance()
  {
    // вот здесь можно ли каким-то образом узнать, что следом вызывается Tango?
    return *this;
  }

  Dancer & Tango()
  {
    return *this;
  }
};

....

Dancer d;
d.Dance().Tango();

Можно ли, находясь в теле Dance, узнать, что за ним еще вызывается Tango?

p.s. Цепочка вызовов может быть какой угодно. Даже такой d.Dance().Dance();

#1
8:35, 8 апр. 2019

Нет. Можно только обратно по коллстэку пройтись.

#2
8:38, 8 апр. 2019

Vitorio

Dancer& Dance(bool nextWillBeTango)
{
  if (nextWillBeTango)
  {
    ...
  }

  return *this;
}
#3
9:39, 8 апр. 2019

А цель сего какая? Архитектурную проблему вижу я.

#4
(Правка: 10:26) 10:25, 8 апр. 2019

Делаешь функцию, скармиливаешь ей массив указателей на функции (не знаю, работает ли в плюсах сравнение, чтобы понять, что за вызов), теперь знаешь не только, что было вызвано после, но и что до, где, как, кто отец Сталина и другие интересные вопросы.

Потом идёшь в комитет С++, они берут любое говно и делают тебе так, чтобы это выглядело как цепочка вызова функций. Можно ещё позвонить Александреску и бандитам из Буста перед этим.

#5
10:38, 8 апр. 2019

kalach
> А цель сего какая? Архитектурную проблему вижу я.
Хочу позднюю модификацию свойств, влияющих на работу методов предшественников.
Пожалуй, действительно, такой подход будет не очень логичным и код будет сложне читать.

Вариант от nes получается ручным, хотелось бы полного автомата.:)

#6
11:15, 8 апр. 2019

Было бы желание
https://rextester.com/PJCXB72993

#7
11:30, 8 апр. 2019

Vitorio
> Хочу позднюю модификацию свойств, влияющих на работу методов предшественников.
> Пожалуй, действительно, такой подход будет не очень логичным и код будет сложне
> читать.

код надо писать максимально просто, иначе потом застрелишься разбираться, если придется через 1-2 года возвращаться и отлаживать его, тут на лицо проблемы с нелогичностью поведения, если только из спортивного интереса таким заниматься, то можно попробовать обернуть все методы в макросы и регистрировать последовательность вызовов на этапе компиляции

#8
(Правка: 11:34) 11:33, 8 апр. 2019

Vitorio
Если захотеть, можно соорудить что-то вроде:
https://rextester.com/GPX64485
https://rextester.com/BALAO7706

Но чем оно лучше явного массива указателей?

#9
11:52, 8 апр. 2019

Не, нужен мет, который по положению в коде компайлтаймово определяет цепочку вызово функций, потом по ним лезет в АСТ и из него извлекает инфу о том, что вызывается дальше.

Но вообще я не могу понять, на кой это надо.

#10
12:18, 8 апр. 2019

Интереса ради, можно получить указатель на функцию и пройтись по всем call в поисках нужного указателя. Правда с виртуалами это так не сработает.

#11
12:23, 8 апр. 2019

Цепочка - своеобразная очередь элементов. Можно хранить в предыдущем элементе ссылку на следующий элемент в очереди.  Соответственно, в последнем елементе ссылка на следующего в очереди - nullptr.

#12
(Правка: 12:28) 12:28, 8 апр. 2019

monobogdan
> Интереса ради, можно получить указатель на функцию и пройтись по всем call в
> поисках нужного указателя. Правда с виртуалами это так не сработает.
Можно и с виртуальными, только решение будет от компилятора зависить. Но это уже хаки во всю красу.

#13
(Правка: 12:29) 12:29, 8 апр. 2019

kalach
В общем случае, указатель на VMT лежит в начале класса и найти его скорее всего не будет проблемой. Вопрос в скорости.

#14
12:34, 8 апр. 2019

monobogdan
> Интереса ради, можно получить указатель на функцию и пройтись по всем call в
> поисках нужного указателя. Правда с виртуалами это так не сработает.
Фу, рантайм. Это же инфа времени компиляции, вы чо

Страницы: 1 2 3 Следующая »
ПрограммированиеФорумОбщее