这是一个涉及继承、模板类和函数指针的问题。我正在开发一个模块化工具,这里是它的最小描述。
我有一个通用基类,我需要尽可能通用(原因未在此处说明):
// base class
class Base {
public:
virtual void assess( ) = 0;
};
然后我有一个更专业的派生类,我将其定义为模板:
// derived template class
template <typename T>
class Derived : public Base
{
protected:
T mValue;
public:
void assess( );
T value( ) { return mValue; }
};
// function specialization here
template<>
inline void Derived<int>::assess( )
{
mValue = 3;
}
有些部分是专门的,如assess()
函数,如上所示。
然后我有一个额外的继承层。主要思想是有一个通用assess()
函数,该函数涉及一个以Base
对象为参数的函数指针。
// class specialization for special evaluation through function pointers
template <typename T>
class DerivedFuncPtr : public Derived<T> {
protected:
T (*mFuncPtr)( Base& );
Base *mFuncVar;
public:
DerivedFuncPtr<T>( T (*f)(Base&), Base& variable )
{
mFuncPtr = f;
mFuncVar = variable;
}
void assess( )
{
mFuncVar->assess();
this->mValue = (*mFuncPtr)(*mFuncVar);
}
};
好的,问题是如何使用它。主要来源如下所示:
int squared( Derived<int>& );
int squared( Derived<int>& d )
{
int val = d.value();
return val*val;
}
int main (int argc, const char * argv[])
{
Derived<int> object;
object.assess();
cout << object.value() << "\n" ;
DerivedFuncPtr<int> objectFP( squared, object ); // (*)
return 0;
}
在线编译时出现错误(*)
Candidate constructor not viable: no known conversion from 'int (Derived<int> &)' to 'int (*)(Base &)' for 1st argument
我是否会被迫将函数指针封装到模板U (*)(Base&)
类中,还是我在这里遗漏了一些明显的东西?
为了美观,并且因为我真的不熟悉最近的 C++ 演变,我宁愿不使用boost
库或 C++11,但是,如果不能帮助...谢谢。