c – 如何在cpp文件中为多种类型创建模板类成员实现

我有一个名为w32file的模板类,可以同时使用wchar_t和char.宣布:

template <typename T>
    class w32file { ... }

它有许多成员方法,例如:

inline bool isDirectory();

现在我知道我可以将这些成员方法的所有实现放在头文件中,然后将它们编译到任何使用我的模板的目标文件中.但是,我并不是真的想要这个,因为这个类将被遍地使用,并且会导致很多重复的目标代码.

所以目前,我有一个链接到静态库的cpp文件,它执行此操作:

bool w32utils::w32file<wchar_t>::isDirectory()
{
    auto dwAttr = GetFileAttributes(m_name.c_str());
    return ((dwAttr & FILE_ATTRIBUTE_DIRECTORY) == FILE_ATTRIBUTE_DIRECTORY);
}

bool w32utils::w32file<char>::isDirectory()
{
    auto dwAttr = GetFileAttributes(m_name.c_str());
    return ((dwAttr & FILE_ATTRIBUTE_DIRECTORY) == FILE_ATTRIBUTE_DIRECTORY);
}

现在,我的目标代码只创建了一次,但我必须在源代码中创建两个基本相同的方法副本.有没有人知道这方面的方法?有没有办法以模板化的方式将两个实现扩展到我的目标文件中?

最佳答案 定义模板化的函数并使用显式模板实例化:

namespace w32utils
{
  template <typename T>
  bool w32file<T>::isDirectory()
  {
    const auto dwAttr = GetFileAttributes(m_name.c_str());
    return ((dwAttr & FILE_ATTRIBUTE_DIRECTORY) == FILE_ATTRIBUTE_DIRECTORY);
  }


  template class w32file<char>;
  template class w32file<wchar_t>;
}

请注意,我强烈建议将其放在标题中并将其内联!

点赞