C++使用模板对象进行操作
C++ Operating with template objects
我有一个类
class BarBase {
};
以及派生模板类,该类存储指向成员函数的指针和指向同一类的对象的指针
template<typename TypeName> class Bar: public BarBase
{
void ( TypeName::*action ) ( void );
TypeName* object;
};
我创建Bar
的实例,并将指向它们的指针存储在另一个类Foo
的向量中
class Foo {
private:
vector<BarBase*> myBars;
...
};
现在开始提问。Foo有一个模板功能
template <typename TypeName>
void Foo::foo( TypeName* object , void ( TypeName::*action ) ( void ) )
在这个函数中,如何在myBars
中找到字段object
和action
等于这个函数参数的元素?正如你所看到的,我不能直接访问像this->myBars[i]->action
这样的字段,因为这些字段不是(也不可能是)BarBase
的成员。
编辑我确实可以比较object
。我在BarBase
中添加了一个virtual size_t getObject (){};
,并像virtual size_t getObject (){ return (size_t)this->object; };
一样在Bar
中覆盖它。然后我比较了两个size_t
,但我不知道如何将action
转换为数字。。。
最简单的解决方案是使基类多态,并使用dynamic_cast
来确定它是否具有预期的类型:
class BarBase {
public:
virtual ~BarBase() {} // virtual function required for polymorphism
};
Bar<TypeName>* bar = dynamic_cast<Bar<TypeName>*>(myBars[i]);
if (bar && bar->object == object && bar->action == action) {
// it's a match
}
这确实增加了一些支持RTTI的开销;在我的脑海中,我想不出任何明确的方法来做到这一点,而不增加开销。
如果你不想使用Mike变体(我更喜欢他的变体),你可以使用这样的东西。
class BarBase
{
public:
virtual ~BarBase() { }
virtual void* getObject() { return 0; }
virtual const char* getFunctionName() { return 0; }
};
template<typename T>
class Bar : public BarBase
{
public:
Bar(T* obj, void (T::*func) (void)):object(obj), action(func)
{
}
virtual void* getObject() { return object; }
virtual const char* getFunctionName() { return typeid(action).name(); }
T* object;
void (T::*action)(void);
};
http://liveworkspace.org/code/d79e33d4597ee209645026b2100330f3
编辑
对不起。这不是问题的解决方案,因为typeid(&S::action).name()
可能等于typeid(&S::other_action).name()
。
此外,也可以使用dynamic_cast
或static_cast
,而不是用于矢量中的所有对象。
class BarBase
{
public:
virtual ~BarBase() { }
virtual void* getObject() const { return 0; }
};
template<typename T>
class Bar : public BarBase
{
public:
Bar(T* obj, void (T::*func) (void)):object(obj), action(func)
{
}
virtual void* getObject() const { return object; }
T* object;
void (T::*action)(void);
};
for (auto pos = objects.begin(); pos != objects.end(); ++pos)
{
if ((*pos)->getObject() == &p)
{
auto bar = static_cast<Bar<S>*>(*pos);
if (bar->action == act)
{
// right object founded.
}
}
}
http://liveworkspace.org/code/87473a94411997914906c22ef0c31ace
- 使用操作重载对象重新分配对象
- 如何在不复制的情况下操作 QByteArray 对象?
- 如果普通默认构造函数不执行任何操作,为什么我们不能使用 malloc 创建平凡可构造的对象?
- 如何在 c++ 中操作当前对象的地址?
- 操作后通过运算符分配对象
- 为什么互斥对象与原子操作不同,前者是操作系统级,后者是处理器级
- pybind 如何对 py::list 对象进行操作
- 在C++中,当表达式涉及对象时,将表达式赋值到对象中时,是否有定义的操作顺序?
- 设计模式中对象中的过程(方法和操作)的状态
- 具有已定义操作重载的 C++ 非类型化值对象/变量库
- 如何在多个函数中操作 ifstream 对象
- 如何通过 COM 互操作访问复杂对象的属性?
- 从对象成员函数内部删除操作的技术 /设计模式
- 如何使用多态性将相同的操作应用于具有相同基类的不同对象的unordered_sets
- 在提前操作过程中,对象会发生什么
- 命令模式:如何进行连续操作?(例如,移动对象)
- 在多个lambdas捕获的对象上操作
- 想要使用矢量指针来操作对象成员的值
- 使用C++中的COM互操作对象
- 在共享内存中存储和操作对象数组