6.3w+
社区成员
#include <iostream>
using namespace std;
template<class T>
class TestBase
{
private:
bool isStandardCall;
T *refObject;
void(T::*callackMFPtr)(char);
void(*callbackSFPtr)(char);
public:
explicit TestBase(T *object, void(T::*aMFPtr)(char)) : isStandardCall(false), refObject(object), callackMFPtr(aMFPtr) {}
explicit TestBase(void(*aSFPtr)(char)) : isStandardCall(true), refObject(NULL), callbackSFPtr(aSFPtr) {}
void SetFunction(T *, void (T::*)(char));
void SetFunction(void (*)(char));
void operator()(char);
};
template<class T>
void TestBase<T>::SetFunction(T *object, void(T::*aMFPtr)(char))
{
this->isStandardCall = false;
this->refObject = object;
this->callackMFPtr = aMFPtr;
}
template<class T>
void TestBase<T>::SetFunction(void (*aSFPtr)(char))
{
this->isStandardCall = true;
this->callbackSFPtr = aSFPtr;
}
template<class T>
void TestBase<T>::operator()(char s)
{
if(this->isStandardCall)
(this->callbackSFPtr)(s);
else
(this->refObject->*this->callackMFPtr)(s);
}
void TestFun1(char cs)
{
cout << "standard function: TestFun1(" << cs << ")" << endl;
}
class TestClass {
public:
void TestFun2(char cs)
{
cout << "member function: TestFun2(" << cs << ")" << endl;
}
};
int main(void)
{
TestBase<string> testBase1(TestFun1);
testBase1('A');
TestClass testClass;
TestBase<TestClass> testBase2(&testClass, &TestClass::TestFun2);
testBase2('B');
testBase2.SetFunction(TestFun1);
testBase2('C');
testBase2.SetFunction(&testClass, &TestClass::TestFun2);
testBase2('D');
return 0;
}