
On Sun, Sep 12, 2010 at 5:54 AM, John Bytheway <jbytheway+boost@gmail.com> wrote:
On 11/09/10 19:52, Lorenzo Caminiti wrote:
I almost wish Boosters could conclude they will not want/accept the hack and they are willing to use `this_` so to make Boost.LocalFunction implementation easier :) .
*** Please advice -- or ask questions if you need more information in order to advice. ***
I think requiring this_ is fine. I was a bit worried about the
Do other Boosters share the same opinion?
possibility of silent failure when people forget (quite likely to happen during refactoring) but luckily there are very few circumstances I can thing of where it wouldn't give a compile error when you accidentally use this (the two that spring to mind are printing out the value, and reinterpret_casting it). Still, if there were a way to make it impossible to use 'this' at all, that would be nice to avoid this risk (but I doubt you can).
Actually, if the CONFIG macro is left #undef (default) then `this_` must be used and the local function is implemented as a static function so `this` cannot be used at all (not even by mistake). For example, the code below generates this error on GCC: $ g++ -Wall -Werror -I./src example/local_function_/line.cpp example/local_function_/line.cpp: In static member function ‘static double c::f(double)::contractXlocal_function_functorXlineX::contractXlocal_function_castableX::contractXlocal_function_bodyX(int, const double&, int, c*)’: example/local_function_/line.cpp:27: error: ‘this’ is unavailable for static member functions struct c { c(): y_(0.0) {} double f(double x) { int offset = x > 0 ? +100 : -100; CONTRACT_DETAIL_LOCAL_FUNCTION( (double) (line)( (int)(slope) (const bound)((&x)(offset)) (bound)((this)) ) ) { double y = slope * x + offset; return this->y_ = y; // ERROR: `this` not available (must use `this_` instead). } CONTRACT_DETAIL_LOCAL_FUNCTION_END(line) return line(2); } private: double y_; }; -- Lorenzo