我是否可以避免模板化需要模板化成员的类
Can I avoid templating a class which needs to have a templated member?
>我有两个类:CFileFinderThread
封装一个工作线程,CFileFinderCallbackForwarder
线程数据转发到几个可能的外部回调函数之一(具有不同的签名)。回调函数的类型是转发器的模板参数。
CFileFinderCallbackForwarder<zCallBack> forwarder(zcallback);
CFileFinderThread<zCallBack> thread(forwarder);
while (thread.WaitForThread(0) != WAIT_OBJECT_0)
{
bool eventSignaled = ::WaitForSingleObject(forwarder.getCallbackSignal(),
DEFAULT_CALLBACK_MILLIS)
== WAIT_OBJECT_0;
forwarder.ExternalCallback(eventSignaled);
}
thread 类保留对转发器实例的引用,并调用转发器中的方法以在其中存储数据 - 但仅限于不以任何方式使用模板参数的方法。根据模板参数,实际上唯一不同的方法是 ExternalCallback
。
是否可以避免使用转发器使用的回调函数的类型模板化线程类?
或者有什么替代方案?因为线程真的根本不应该关心转发器将如何处理其数据。
将
转发器类划分为非泛型基类和泛型派生类。显然,非泛型基类应包含所有非泛型数据和操作;派生类应包含 ExecuteCallback
函数。
这允许您使线程类也成为非泛型的。
下面是一个简化但完整的示例:
// non-generic base:
class CFileFinderCallbackForwarderBase
{
private:
int i;
protected:
// making the constructor protected here is just good practice:
CFileFinderCallbackForwarderBase() {}
public:
void SetData() { i = 0; }
};
// thread class is now non-generic
class CFileFinderThread
{
private:
// thread class is non-generic because it only uses
// the base class:
CFileFinderCallbackForwarderBase* forwarder;
public:
CFileFinderThread(CFileFinderCallbackForwarderBase* forwarder) :
forwarder(forwarder)
{
}
void f()
{
forwarder->SetData();
}
};
// derived class is generic:
template <class T>
class CFileFinderCallbackForwarder : public CFileFinderCallbackForwarderBase
{
public:
void ExternalCallback()
{
T t;
t = 0;
}
};
int main()
{
CFileFinderCallbackForwarder<int> forwarder;
CFileFinderThread thread(&forwarder);
forwarder.ExternalCallback();
}
这种技术的一个积极的副作用可能是减少代码膨胀。
相关文章:
- 添加静态constexpr成员是否会更改结构/类的内存映射
- 内存中类位置的成员是否取决于类成员在类定义中的位置?
- 访问从联合与另一个成员集复制的联合中的一个成员是否未定义或未指定?
- POD 结构(相同类型的成员):成员是否位于连续的内存位置?
- 将结构别名为其第一个成员是否严格违反别名
- 将指针指向它的第一个成员是否违法?
- 常量指针到成员是否默认指向 int?
- 友元函数将内存分配给数组成员是否有任何限制?
- 检查成员是否在类中声明
- 给定仅包含布尔类型成员的结构的两个对象 s1 和 s2,只要 s1 的成员为 true,请检查 s2 的每个成员是否为真
- 未使用的数据成员是否占用内存
- 静态数据成员是否在所有类对象之前初始化?
- 如何检查两个元组的所有成员是否不同
- 使用之前在初始值设定项列表中初始化的成员初始化成员是否安全
- 使用enableif检查成员是否存在
- 类的成员是否可以与其类型(另一个类)命名相同的名称
- 堆分配类的成员是否在堆中自动分配
- 成员是否继承自超类的超类
- std::函数成员是否可以访问其他成员
- C++预处理器测试类成员是否存在