// test.cpp
// xp + vc-7_1
// cl -EHsc test.cpp
#include <iostream>
template <typename MF>
class delegate;
template <class R, class T, class P>
class delegate <R (T::*)(P)> {
public:
delegate(T & t, R (T::*fn)(P), P const & p)
: t_(t),
fn_(fn),
p_(p) { }
R call() {
return (t_.*fn_)(p_);
}
private:
T & t_;
R (T::*fn_)(P);
P p_;
};
// --------
class test {
public:
double foo(int x) {
return static_cast <double> (x);
}
};
int main() {
delegate <double (test::*)(int)> d(test(), &test::foo, 100);
std::cout < < d.call() < < std::endl;
return 0;
}
// xp + vc-7_1
// cl -EHsc test.cpp
#include <iostream>
template <typename MF>
class delegate;
template <class R, class T, class P>
class delegate <R (T::*)(P)> {
public:
delegate(T & t, R (T::*fn)(P), P const & p)
: t_(t),
fn_(fn),
p_(p) { }
R call() {
return (t_.*fn_)(p_);
}
private:
T & t_;
R (T::*fn_)(P);
P p_;
};
// --------
class test {
public:
double foo(int x) {
return static_cast <double> (x);
}
};
int main() {
delegate <double (test::*)(int)> d(test(), &test::foo, 100);
std::cout < < d.call() < < std::endl;
return 0;
}