У меня есть шаблон класса с функцией шаблона-члена eval_sub, который используется только внутри функции-члена eval. Хотя удаление eval_sub является спорным, наличие eval_sub облегчает чтение, поскольку eval_sub существует именно так. Однако мне не нравится видимость eval_sub после свертывания определения eval, потому что eval_sub имеет значение только для eval.
< pre class="lang-cpp Prettyprint-override">
Код: Выделить всё
template
struct A{
double x;
template void eval_sub(){
x+=exp(k);
}
void eval(){
[this](std::index_sequence){ (eval_sub(), ...); }(std::make_index_sequence{});
}
};
Что я пробовал:
- автоматическая лямбда, очевидно, работает, но я отказываюсь от нее по нескольким причинам. 1) авто неявно. 2) Эксплитизация бесполезна не из-за языковой болезни в жаргоне указателей, а из-за того факта, что такой указатель (он же «лямбда») никогда не нужен. Показательный пример: мне не нужно помещать адрес eval_sub в переменную только для того, чтобы вызвать ее. Скорее, автоматическая лямбда является джейлбрейком, который просто не позволяет компилятору отклонить определение функции в области видимости функции.
- помещение статической структуры перед eval_sub уничтожает функцию-член характеристика, заключающаяся в том, что перед каждым доступом к атрибуту внутри eval_sub мне теперь придется захватывать дескриптор A this, что стирает полезность.
PS: Я знаю, что запрещает язык. Мне любопытно, как потребители языка (то есть эта аудитория) решают эту дилемму. Как вы обычно поступаете в этом случае? Если ответ «авто лямбда», то я сдаюсь.
Подробнее здесь: https://stackoverflow.com/questions/784 ... ions-scope