изучая тему функций constexpr/operator в С++ 11, я наткнулся на эту статью: http://www.codeproject.com/Articles/447922/Application-of-Cplusplus11-User-Defined-Literals-t
Он цитирует пример того, как будет выглядеть код, обеспечивающий преобразование строки в двоичное число udl:
constexpr unsigned long long ToBinary(unsigned long long x, const char* s)
{
return (!*s ? x : ToBinary(x + x + (*s =='1'? 1 : 0), s+1));
}
constexpr unsigned long long int operator "" _b(const char* s)
{ return ToBinary(0,s);}
все работает как заявлено, но мне не совсем нравится, что глобальное пространство имен засорено вспомогательной функцией ToBinary. Вместо того, чтобы пытаться изменить имя функции, я пытался придумать решение, в котором рекурсивная лямбда-функция была бы встроена в тело оператора.
Решения для рекурсивных лямбда-выражений в C++ известны и используют использование std::function. Чтобы сделать это возможным в операторе constexpr, нужно было бы, чтобы объявление и вызов рекурсивной лямбды были встроены в один оператор return. Мои попытки добиться этого не увенчались успехом, поэтому я прибегаю к SO за помощью. Возможен ли вообще рекурсивный лямбда-вызов внутри оператора constexpr? Если да, то какие подсказки?
Спасибо,
operator()
лямбды не помеченconstexpr
, поэтому это невозможно. - person Xeo   schedule 03.10.2013constexpr int foo(bool p) { return p ? 42 : [](){ return 255; }(); }
в порядке. - person dyp   schedule 03.10.2013foo(false)
не будет работать как постоянное выражение. - person Xeo   schedule 03.10.2013