Re: outer class `this` in local classes without inheritance?
I am programming a macro which evaluates a code expression in constant-
correct context by executing the code from within a local function by
passing the object `this` and other variables as `const`. For example,
the `BLOCK_INVARIANT()` macro can be programmed so that the following:
class c {
public:
c(int x): x_(x) {}
bool eq(int x) const { return x_ == x; };
void f(int x) {
BLOCK_INVARIANT( (const (c*)(this) (int)(x) (this_->eq(x)
== false)) )
}
private:
int x_;
};
Expands to:
class c {
public:
c(int x): x_(x) {}
bool eq(int x) const { return x_ == x; };
void f(int x) {
struct block_invariant {
static void check(c const* const this_, int const& x)
{
if(!( this_->eq(x) == false )) { // Evaluated in
constant-correct context because `this_` and `x` are `const`.
throw int(-1);
}
}
};
block_invariant::check(this, x);
}
private:
int x_;
};
Now the compiler will generate an error if the code expression passed
to `BLOCK_INVARIANT()` -- `this_->eq(x)` in this example -- is not
constant-correct.
(You could have shown definition of BLOCK_INVARIANT)
That said, if const-correctness is your goal, then you still don't
need additional class. A const_cast (no blind C casts please, we're in
C++ ;-) ) could do, couldn't it?
What if you simply do:
#define BLOCK_INVARIANT(object_type, check, param_type, param) \
{ if (!const_cast<const object_type*>(this)->check((const param_type&)
(param))) throw -1;}
and then, in f():
BLOCK_INVARIANT(c, eq, int, x).
You can eliminate c by using another macro inside class definition
file, e.g. in c.cpp
#define BLOCK_INVARIANT_C(check, param_type, param) BLOCK_INVARIANT(c,
check, param_type, param)
By the way, that throw -1 stands out like a sore thumb. How's that
supposed to be used? When your invariant is broken, you pop up to the
top of the stack (e.g. to main) and do
catch(int i)
{
return int;
}
?
That's, frankly, worse than crashing or aborting, because you will
lose the place where crash happened. How about at least an exception
containing __FILE__, and __LINE__?
Goran.
--
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]