Re: Defining a cast on a templated class
On Nov 14, 2:59 pm, "Alf P. Steinbach" <al...@start.no> wrote:
* alan:
I'm creating a sort-of "wrapper" class which (partly) acts like a
variable. Something like:
template<class t>
class cell{
t curval;
public:
/*public for debugging only - will be private in final version*/
inline cell<t>& set_value(t v){ curval = v; return *this;}
inline t get_value(){ return curval;}
/*actual public interface*/
/*assign to this value*/
inline cell<t>& operator=(t v){ return set_value(v);}
};
...
int
main(void){
cell<int> v;
v = 0;
cout << "v = " << ((int)v);
return 0;
}
However I can't figure out how to make the compiler do v.get_value()
when v is used in an int() context. Since this is templated, the only
conversion I want to support is something like cell<type> -> type.
Attempts to convert to unrelated types should signal an error.
You can't avoid built-in conversions, e.g. int -> double.
Err, what I meant was, not able to do something really dumb, like
cell<int> -> std::string
So the technical answer 'operator type() const' is not a practical one.
That's what I was looking for, thanks!
There are also other reasons (overloading, not doing things behind the
client code programmer's back) that mean that an implicit conversion is
generally ungood.
Instead just provide a named member function.
Hmm. I suppose this is possible since I intend to use it very rarely
anyway.
Still, I think operator type() is good.
I can't figure out the correct syntax to do this, unfortunately
(should probably look for better manuals, sigh).
----
In any case the actual target would be something like this:
int
main(void){
cell<int> v;
cell<int> v2;
v = v2 + 1; //v automatically changes when v2 is changed
v2 = 3;
if((int)v == 4){
cout << "Test 1 passed\n";
} else{
cout << "Test 1 failed\n";
return 1;
}
v2 = 4;
if((int)v == 5){
cout << "Test 2 passed\n";
} else{
cout << "Test 2 failed\n";
return 1;
}
return 0;
}
Basically the cell<> class would be like a spreadsheet cell - when I
assign a formula into it, its value will be automatically updated if
any of the cells in the formula are updated.
The way I intend to implement it is, I extend +-*/ and ?: so that if
any cells are in any parameters, they will instead return a new cell
which registers itself to the input cells. Something like:
template<class t>
cell<t>& operator+(cell<t> v1, t v2){
sum_cell<t> *sum = new sum_cell<t>(v2);
sum.register_yourself_to(v1); //when v1 is update()d, sum's update()
method is called
return (cell<t>&) *sum;
}
If there is already some existing library that does (in some form) the
above, please inform me. I suspect there already is, somehow I have a
feeling I've seen it before.
Perhaps look at the Open Office source?
Hmm.
I just want to be able to do something like:
cell<int> CON, baseCON, inventoryCON, wornCON;
void
declarations(void){
size_t i;
CON = baseCON + inventoryCON + wornCON;
inventoryCON = 0; wornCON = 0;
for(i = 0; i < 52; i++){
inventoryCON = inventoryCON + inventory[i].CONbonuswhencarried;
wornCON = wornCON +
inventory[i].worn ? inventory[i].CONbonuswhenworn :
/*else*/ 0 ;
}
}
Then at any point, all I need to ask for CON, without having to
explicitly perform the computation myself each time the inventory
changes, items are worn/unworn, etc.
Is ?: overloadable?
Although of course there will probably be 5 other stats, so I'll be
thinking how to do that (maybe put stats as an array too).
Cheers, & hth.,
- Alf
--
A: Because it messes up the order in which people normally read text.
Q: Why is it such a bad thing?
A: Top-posting.
Q: What is the most annoying thing on usenet and in e-mail?