我有一个类CMyObject,它有一些getter函数来访问各种成员(例如,类型为CTheValueHolder的成员),而这些成员又有一个setter,每个成员都有一个双值。此调用链需要应用于列表中CMyObject类型的所有项,访问的类及其setter函数在整个代码中随机更改。为了保持代码简短,我想使用一种方法,在这种方法中,我可以将getter函数全部传递给CMyObject实例上的另一个对象(CTheValueHolder)、要在该对象上执行的函数和要设置的值。
代码如下所示:
// header
class CMyService
{
template <typename T> void ApplyToList(T* (CMyObject::*getMember)(), void (T::*memberFunction)(double), double iNewValue);
}
// implementation
template <typename T>
void CMyService::ApplyToList<T>(T* (CMyObject::*getMember)(), void (T::*memberFunction)(double), double iNewValue)
{
std::list<CMyObject*>myList = GetList();
std::list<CMyObject*>::iterator endIter = myList.end();
for (std::list<CMyObject*>::iterator iter = myList.begin(); iter != endIter; iter++)
{
if (*iter)
{
(((*iter)->*getMember)->*memberFunction)(iNewValue);
}
}
}
CMyObject::*getMember可能如下所示:
CTheValueHolder* CMyObject::GetTheValueHolder()
{
return m_pTheValueHolder;
}
价值持有人可定义为:
class CTheValueHolder
{
// ....
void SomeValueSetter(double fNewValue);
// ....
}
因此:
// call from within CMyService
void CMyService::SomeFunction()
{
// ....
double fSomeNewValue = 123.456;
ApplyToList<CTheValueHolder>(&CMyObject::GetTheValueHolder, &CTheValueHolder::SomeValueSetter, fSomeNewValue);
// ....
}
这样,我得到了错误C2768:“CMyService::ApplyToList”:显式模板参数的非法使用。
有什么想法可以解释为什么以及如何做到这一点吗?
顺便说一句:我目前一直在使用VS2010,所以我没有完整的C++11可用。