模板化函数指针从子类到父类的转换

Conversion from child class to parent for templated function pointer

本文关键字:父类 转换 子类 函数 指针      更新时间:2023-10-16

这是一个涉及继承、模板类和函数指针的问题。我正在开发一个模块化工具,这是对它的最小描述。

我有一个通用基类,我需要尽可能通用(出于此处未指定的原因):

// 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,但是,如果它无济于事...... 谢谢。

DerivedFuncPtr<T>( T (*f)(Base&), Base& variable )

构造函数的第一个参数是指向函数的指针,该函数将Base&作为参数(并返回T)。函数指针的Base&参数与squared的参数不匹配,这需要Derived<int>&

解决此问题的一种方法是DerivedFuncPtr一个类模板,该类模板采用两个模板参数,一个是已有的typename T,另一个是其他类型名,用于替换数据成员和构造函数中Base的使用。

顺便说一句,您还会在该构造函数中收到有关mFuncVar = variable;的错误。mFuncVar是指针,variable是参考。