zoukankan      html  css  js  c++  java
  • 如何在动态链接库dll/so中导出自定义的模板类template class | how to implement a template class with c++ and export in dll/so

    本文首发于个人博客https://kezunlin.me/post/4ec4ae49/,欢迎阅读最新内容!

    how to implement a template class with c++ and export in dll/so

    Guide

    questions

    模板类必须在header中实现,而不能在cpp中实现,否则作为dll调用进行链接的时候回出错。

    common solutions(Recommend)

    implement template functions in header.

    ThreadPool.h

    class  SHARED_EXPORT ThreadPool {
    public:
    	static ThreadPool* Instance(size_t max_thread_pool_size);
    	~ThreadPool(); 
    
    	// Add new work item to the pool.
    	template<class F> 
    	inline void Enqueue(F f)
    	{
    		io_service_.post(f);//sync, return immediately
    	}
    
    	void Free();
    
    private:
    	static std::shared_ptr<ThreadPool> m_pInstance;
    	bool bfree;
    
    	ThreadPool(size_t size);
    	DISABLE_COPY_AND_ASSIGN(ThreadPool);
    
    	boost::thread_group workers_;
    	boost::asio::io_service io_service_;
    	boost::asio::io_service::work work_;
    };
    

    Seperate from headers

    solutions 1

    A common solution to this is to write the template declaration in a header file, then implement the class in an implementation file (for example .tpp), and include this implementation file at the end of the header.

    Foo.h

    template <typename T>
    struct Foo
    {
        void doSomething(T param);
    };
    
    #include "Foo.cpp" // here
    

    Foo.cpp

    template <typename T>
    void Foo<T>::doSomething(T param)
    {
        //implementation
    }
    

    solutions 2

    Another solution is to keep the implementation separated, and explicitly instantiate all the template instances you'll need:

    Foo.h

    // no implementation
    template <typename T> struct Foo { ... };
    

    Foo.cpp

    #include "Foo.h"
    
    // implementation of Foo's methods
    
    // explicit instantiations
    template class Foo<int>;
    template class Foo<float>;
    // You will only be able to use Foo with int or float
    
    // template void TestClass::templateFunction<int, int>(int, int);
    

    Reference

    History

    • 20191012: created.

    Copyright

  • 相关阅读:
    @SneakyThrows
    docker部署elasticsearch
    docker部署rabbitmq
    docker部署minio
    docker 部署 jenkins
    linux 根据文件名全局查找位置
    docker 容器与宿主机之间文件拷贝
    excel 查看当前单元格是否存在某一列
    机器学习sklearn
    一些博客链接
  • 原文地址:https://www.cnblogs.com/kezunlin/p/12071205.html
Copyright © 2011-2022 走看看