【问题标题】:Way to set up class template with explicit instantiations使用显式实例化设置类模板的方法
【发布时间】:2011-04-01 20:25:21
【问题描述】:

在询问了this question 并阅读了很多关于模板的内容后,我想知道下面的类模板设置是否有意义。

我有一个名为 ResourceManager 的类模板,它只会加载一些特定的资源,例如 ResourceManager<sf::Image>ResourceManager<sf::Music> 等。显然我在 ResourceManager.h 中定义了类模板。但是,由于只有几个显式实例化,是否适合做类似...

// ResourceManager.cpp
template class ResourceManager<sf::Image>;
template class ResourceManager<sf::Music>;
...

// Define methods in ResourceManager, including explicit specializations

简而言之,我试图找到最简洁的方式来处理声明和定义模板类及其方法,其中一些可能是显式的特化。这是一种特殊情况,我知道只会使用几个显式实例化。

【问题讨论】:

    标签: c++ templates explicit-specialization


    【解决方案1】:

    是的。
    这是完全合法的。

    您可能希望隐藏它在 typedef 后面模板化的事实(如 std::basic_string 所做的那样),然后在标题中添加注释以不显式使用模板。

    资源管理器.h

    template<typename T>
    class ResourceManager
    {
        T& getType();
    };
    
    // Do not use ResourceManager<T> directly.
    // Use one of the following types explicitly
    typedef ResourceManager<sf::Image>   ImageResourceManager;
    typedef ResourceManager<sf::Music>   MusicResourceManager;
    

    资源管理器.cpp

    #include "ResourceManager.h"
    
    // Code for resource Manager
    template<typename T>
    T& ResourceManager::getType()
    {
        T newValue;
        return newValue;
    }
    
    // Make sure only explicit instanciations are valid.
    template class ResourceManager<sf::Image>;    
    template class ResourceManager<sf::Music>;   
    

    【讨论】:

      【解决方案2】:

      如果您需要不同的函数实现,取决于类型,我建议使用继承而不是模板。

      class ResourceManager {
          // Virtual and non-virtual functions.
      }
      
      class ImageManager : public ResourceManager {
          // Implement virtual functions.
      }
      
      class MusicManager : public ResourceManager {
          // Implement virtual functions.
      }
      

      【讨论】:

      • 不,这不是必需的。关键是将类模板函数的定义放在头文件中没有#included 的.cpp 文件中(通常您在头文件中定义模板函数)。除非您明确指定类模板的特化,否则这不起作用。事实上,真正需要专门化的功能只有一个。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-11
      • 2014-10-13
      • 1970-01-01
      • 1970-01-01
      • 2015-08-11
      相关资源
      最近更新 更多