no message

git-svn-id: svn://svn.code.sf.net/p/loki-lib/code/trunk@124 7ec92016-0320-0410-acc4-a06ded1c099a
This commit is contained in:
humesikkins 2003-03-20 21:48:12 +00:00
parent 4d8052faa7
commit 361dc34156

View file

@ -29,6 +29,10 @@ If you use Singletons with longevity you must add Singleton.cpp to your project/
Fixes: Fixes:
------ ------
Mar 20, 2003:
-------------
* In MultiMethods.h: Fixed bugs in FnDispatcher and FunctorDispatcher.
Fixing FnDispatcher lead to an Interface change (see section "Interface changes").
Mar 08, 2003: Mar 08, 2003:
------------- -------------
@ -203,6 +207,69 @@ Unfortunately the MSVC 6.0 supports neither of them.
} }
[/code] [/code]
Unfortunately adding dummy-parameters does not always work.
For example for one of FnDispatcher's Add-member-functions you have to explicitly
specify two type- and one non-type parameter.
[code]
template </*...*/typename ResultType/*...*/>
class FnDispatcher
{
public:
//...
template <class SomeLhs, class SomeRhs,
ResultType (*callback)(SomeLhs&, SomeRhs&)>
void Add(){/*...*/}
};
//...
FnDispatcher<Shape> dis;
dis.Add<Poly, Poly, &AFunc>();
[/code]
Using dummy-parameters as workaround FnDispatcher::Add would become something
like this:
[code]
template<class S1, class S2, class R, R (*)(S1&,S2&)>
struct Helper {};
template </*...*/typename ResultType/*...*/>
class FnDispatcher
{
public:
//...
template <class SomeLhs, class SomeRhs,
ResultType (*callback)(SomeLhs&, SomeRhs&)>
void Add(Helper<SomeLhs, SomeRhs, ResultType, callback>)
{}
};
//...
FnDispatcher<void> f;
f.Add(Helper<Rectangle, Rectangle, void, &Func>());
[/code]
This compiles fine, but alas Add never gets called. I don't know what happens,
I only know that the MSVC 6.0 won't generate code for a function call.
In situations like that, instead of dummy-Parameters I used nested template-classes
with overloaded function-operator as a workaround.
[code]
template </*...*/typename ResultType/*...*/>
class FnDispatcher
{
public:
// the member-function Add becomes a member-template-class
// with overloaded function operator.
template <class SomeLhs, class SomeRhs,
ResultType (*callback)(SomeLhs&, SomeRhs&)>
struct AddI
{
void operator()(FnDispatcher<ResultType>& o) {/*...*/}
};
};
//...
FnDispatcher<void> f;
FnDispatcher<void>::AddI<Rectangle, Rectangle, &Func>()(f);
[/code]
If you know of a better workaround, please let me know.
D. Virtual functions that use covariant return types (e.g. return a pointer to Derived) D. Virtual functions that use covariant return types (e.g. return a pointer to Derived)
in the original library were changed so that they have exactly the in the original library were changed so that they have exactly the
same return type as the original virtual function (e.g. return a pointer to Base). same return type as the original virtual function (e.g. return a pointer to Base).
@ -539,6 +606,21 @@ Interface changes:
{ {
x.Add(&Hatch_Helper<Circle, Rectangle>::HatchShapes); x.Add(&Hatch_Helper<Circle, Rectangle>::HatchShapes);
} }
Some words to FnDispatcher:
---------------------------
The trampoline-Versions of FnDispatcher::Add differ
from the original library.
Using the original library one writes:
typedef FnDispatcher<Shape> Dispatcher;
void Hatch(Rectangle& lhs, Poly& rhs) {...}
Dispatcher dis;
disp.Add<Rectangle, Poly, &Hatch>();
Using this port the last line has to be:
Dispatcher::AddI<Rectangle, Poly, &Hatch>()(dis);
More info: More info:
---------- ----------