существующем коде все выражения вида foo(..., getContext()); обернуть вызовами enter(ctx); / exit(ctx);, минимально меняя код (и желательно с гарантией что в новых подобных выражениях было невозможно забыть обертку.
Преполагаемое решение:
Пусть getContext() возвращает временную не копируемую структуру WrappedCtx, конструктор/деструктор которой вызывает enter/exit и которая конвертится в Ctx.
Какие у такого подхода могут быть подводные камни?
exit noexcept?
пока из потенциальных проблем я вижу что можно сохранить Ctx в локальную переменную, но это можно явно запретить правилом в clang-tidy
Вот тебе еще камень - потенциальное выражение f(getContext(), getContext()) у тебя нет гарантии что только один enter и exit
так и надо же не?
https://en.wikibooks.org/wiki/More_C%2B%2B_Idioms/Execute-Around_Pointer и не надо будет каждый раз добавлять аргумент getContext(), а чтобы минимально меняя код так это ты плогин к кленгу напиши, пусть мошина за тебя код меняет!
Будем ли мы в контексте при вычислении остальных аргументов foo implementation defined. Я бы, возвращал из getContext() proxy с методом invoke, чтобы вызов foo выглядел как getContext().invoke<foo>(arg1, arg2, ...).
Обсуждают сегодня