模板化函数指针从子类到父类的转换
Conversion from child class to parent for templated function pointer
这是一个涉及继承、模板类和函数指针的问题。我正在开发一个模块化工具,这是对它的最小描述。
我有一个通用基类,我需要尽可能通用(出于此处未指定的原因):
// 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
是参考。
相关文章:
- 从类继承时,继承的类是否会通过父类重新定义继承的变量
- 从父类方法返回子类对象
- c++, 在子类中,如何在没有对象的情况下访问父类的方法?
- 将父类对象强制转换为子类的问题
- 从父类的向量访问子类函数,而无需向下转换
- 使用父类实例化的向下转换对象
- 将对象强制转换为派生类以访问父类的受保护成员
- 将子类的成员函数强制转换为父类
- 将"this"从父类方法转换为子类方法是一种好的做法吗?
- 将参数传递给函数,获取父类参数,而不将参数强制转换为父类
- 模板化函数指针从子类到父类的转换
- 在C++对象中:我应该使用父类强制转换指针,还是应该使用实际类本身进行强制转换
- 强制转换为父类对象而不是引用时会出现哪些不良结果
- 通过将父类强制转换为对子类的引用来提供类的可迭代"views"
- 将父类强制转换为子类以避免冗余
- 通过强制转换第一个字段来安全访问父类
- c++使用继承的父类转换为对象类
- 使用=将已定义的父类转换为子类
- 在c++中将父类转换为子类
- 在其中删除对象并将对象转换回父类的成员