[cable] passing number &'s to method
Steve Pieper
pieper at bwh.harvard.edu
Wed Mar 20 20:34:10 EST 2002
Brad -
Amazing - works like a charm!
Don't apologize about this, it's all very logical. I had been thinking
something like this might have already been built in, but no matter.
Your one little class can handle all these situations nicely (at least
the ones I need at the moment).
The example call findAndGetSint16 was in fact a class method, so I
didn't run into any of the namespace level function issues you mentioned.
Thanks for your help and for providing such a great tool!
-Steve
Brad King wrote:
> Steve,
>
>
>>I'm trying my first Cable project and I hope this is an easy question for
>>you: in Tcl, how can I pass the second argument to the following method?
>>
>> OFCondition findAndGetSint16(const DcmTagKey&, short&)
>>
>>The OFCondition and DcmTagKey classes are wrapped up and working nicely,
>>and I can call a similar method to get a string type... but I don't know
>>what to do about the basic types (I also need int, float, double, etc but
>>I assume they'll all fit the same pattern).
>>
>>Background: I'm trying to wrap the DCMTK tools from University of
>>Oldenberg - a very nice dicom implementation you can find at
>>http://dicom.offis.de. I plan to try hooking up their code into vtk/itk
>>at the tcl level. So far CMake and Cable have worked great (until I hit
>>this question).
>>
>
> Since the second argument is a reference type, a Tcl variable cannot be
> passed directly to it. The reason is that after the call is made, there
> is no way for the wrappers to know where to place the value for Tcl to
> find. You will need to implement a wrapper in C++ to provide the value to
> you without a reference. If you have a C++ method return a short& type,
> then it will pass the second argument without a problem.
>
> For example:
>
> template <typename T>
> class ReferencePasser
> {
> T n;
> public:
> ReferencePasser(): n(0) {}
> ReferencePasser(T i): n(i) {}
> T& Pass() { return n; }
> T Get() const { return n; }
> void Set(T i) { n = i; }
> };
>
> Wrapping "ReferencePasser<short>" as ReferencePasser_short will allow the
> following in Tcl:
>
> # Wrap the findAndGetSint16 method of foo.
> proc FindAndGetSint16 { foo key result } {
> upvar $result res
> set srp [ReferencePasser_short 0]
> set val [$foo findAndGetSint16 $key [$srp Pass]]
> set res [$srp Get]
> return $val
> }
>
> This assumes that "foo" is an instance of a class with a findAndGetSint16
> method. If findAndGetSint16 is a namespace-level function, I would
> suggest writing a class that wraps all such functions and hides these
> details. Cable doesn't deal with namespace-level functions very well
> right now, and an upcoming re-write (currently in a cvs branch) will not
> support them at all for a while. Both versions deal with static methods
> in a class with no trouble, though.
>
> I know that the above is very, very ugly, and I wish I had a better
> solution right now. This problem is on my wish-list of things to fix in
> the future.
>
> -Brad
>
>
More information about the cable
mailing list