我想创建一个将被其他对象继承的基类,以便它们可以存储在同一个容器中。此基类将包含一个模板化方法,该方法将函数定义为用于访问多线程系统中的缓冲区的setter或getter。我想做这样的事情,但不确定如何实施Linky。另外我希望能够让基类中的函数成为虚拟的并在派生类中定义功能,我知道你实际上不能拥有虚拟模板函数,但有没有办法以一种方式对其进行编码它就像虚拟模板功能的概念。下面是一个粗略的例子,说明我希望布局如何。可以通过回调调用do_work方法。回调作为参数传递给线程。
class A {
template<typename R, typename P>
virtual R do_work(P param) = 0;
}
class B : public A {
template<void,int> // declare as setter
R do_work(P param){/*do something*/ return R;}
}
class C : public A {
template<int,void> // declare as getter
R do_work(P param){/*do something*/ return R;}
}
答案 0 :(得分:1)
你似乎遇到A是A类中do_work的模板参数的问题:这实际上没有意义。
R未在B或C中的任何位置定义,并且您的专业化语法错误。
do_work不会是多态的,因为它不是虚拟的,所以如果你有一个A指针的集合它只会调用A版本,而不是B或C版本,即使它们是更好的匹配。
答案 1 :(得分:0)
我全都使用模板编程来提高效率和通用性,但也许你应该先用虚函数来实现它。我发现在编写模板化版本之前让某些东西干净利落并进行纠正会很有帮助。
如果你有一个有效的非模板功能,这里的人可能会给你一个更好的答案。
此外,如果您打算通过回调或函数指针来调用它,那么您将失去我认为您试图通过基于模板的解决方案获得的性能。
答案 2 :(得分:0)
我结束了两个辅助类,一个继承基类的消费者类和生成器类。基类包含一个枚举定义,定义派生类是否具有哪些功能。此枚举值在基类构造函数调用期间设置。辅助类包含我想要的虚拟do_work函数的适当版本(一个void有一些输入类型,一个有一些返回类型)。当这些对象放在容器中时,它们被作为基类进行转换,当它们在适当的通用线程工作器函数中启动时,它们被转换为生成器帮助程序类或使用者帮助程序类。