c++ - 在容器中存储模板化对象

标签 c++ templates stl

是否可以存储像

这样的模板化类
template <typename rtn, typename arg>
class BufferAccessor {
  public:
    int ThreadID;
    virtual rtn do_work(arg) = 0;  
}; 

BufferAccessor<void,int> access1;
BufferAccessor<int,void> access2;

像 vector 或列表一样在同一个容器中

编辑: 这样做的目的是我试图制作一个循环缓冲区,其中想要使用缓冲区的对象需要向缓冲区注册。缓冲区将存储一个 boost::shared_ptr 到访问器对象,并生成一个回调到那里的函数,这些函数将数据推送到缓冲区或从缓冲区提取数据。回调将用于我创建的类似于线程池的通用线程工作函数,事实上它们需要访问共享内存对象。下面是我输入的一些代码,可能有助于说明我正在尝试做的事情,但它还没有被编译,这也是我第一次使用绑定(bind)、函数、多线程

 typedef boost::function<BUF_QObj (void)> CallbackT_pro;
        typedef boost::function<void (BUF_QObj)> CallbackT_con;
        typedef boost::shared_ptr<BufferAccessor> buf_ptr;

        // Register the worker object
            int register_consumer(BufferAccesser &accessor) {
                mRegCons[mNumConsumers] = buf_ptr(accessor);
                return ++mNumConsumers;
            }

            int register_producer(BufferAccesser &accessor) {
                mRegPros[mNumProducers] = buf_ptr(accessor);
                return ++mNumProducers;
            }
                // Dispatch consumer threads
                for(;x<mNumConsumers; ++x) {
                    CallBack_Tcon callback_con = boost::bind(&BufferAccessor::do_work, mRegCons[x]);
                    tw = new boost:thread(boost::bind(&RT_ActiveCircularBuffer::consumerWorker, this, callback_con));
                    consumers.add(tw);
                }

                // Dispatch producer threads
                for(x=0;x<mNumProducers; ++x) {
                    CallBack_Tpro callback_pro = boost::bind(&BufferAccessor::do_work, mRegPros[x], _1);
                    tw = new boost:thread(boost::bind(&RT_ActiveCircularBuffer::producerWorker, this, callback_pro));
                    producers.add(tw);
                }
        // Thread Template Workers - Consumer
            void consumerWorker(CallbackT_con worker) {
                struct BUF_QObj *qData;

                while(!mRun)
                    cond.wait(mLock);

                while(!mTerminate) {
                    // Set interruption point so that thread can be interrupted
                    boost::thread::interruption_point();
                    { // Code Block
                        boost::mutex::scoped_lock lock(mLock);
                        if(buf.empty()) {
                            cond.wait(mLock)

                        qData = mBuf.front();
                        mBuf.pop_front(); // remove the front element
                    } // End Code Block

                    worker(qData); // Process data

                    // Sleep that thread for 1 uSec
                    boost::thread::sleep(boost::posix_time::nanoseconds(1000));
                } // End of while loop
            }

            // Thread Template Workers - Producer
            void producerWorker(CallbackT_pro worker) {
                struct BUF_QObj *qData;
                boost::thread::sleep(boost::posix_time::nanoseconds(1000));

                while(!mRun)
                    cond.wait(mLock);

                while(!mTerminate) {
                    // Set interruption point so that thread can be interrupted
                    boost::thread::interruption_point();

                    qData = worker(); // get data to be processed

                    { // Code Block
                        boost::mutex::scoped_lock lock(mLock);
                        buf.push_back(qData);
                        cond.notify_one(mLock);
                    } // End Code Block

                    // Sleep that thread for 1 uSec
                    boost::thread::sleep(boost::posix_time::nanoseconds(1000));
                } // End of while loop
            }

最佳答案

不,不是,因为 STL 容器是同质的,access1 和 access2 具有完全不同的不相关类型。但是您可以将类 BufferAccessor 设为非模板,而将 do-work 成员设为模板,如下所示:

class BufferAccessor
{
   template<class R, class A>
   R doWork(A arg) {...}
};

在这种情况下,您可以将 BufferAccessors 存储在容器中,但不能将成员模板函数设为虚拟。

关于c++ - 在容器中存储模板化对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3962615/

相关文章:

c++ - 多重继承指定所需的虚函数而不重新定义它

c++ - 替换版本信息资源

c++ - 如何在 SQLite3 中查找 stmt 到行号?

templates - Vue.js 本地模板变量

c++ - 关于引用传递的疑惑

javascript - 用于将迭代值(例如数组元素)插入 HTML 的简单 JavaScript 模板文字

c++ - 编译时间间隔检查器

c++ - 将混合数据文件读入 C++ 字符串

c++ - 使用三元运算符在一行中打印不同类型

c++ - STL vector 在哪里保存不同大小的数据项?