Как я могу создать реализации членов класса шаблона в файле cpp для нескольких типов - PullRequest
4 голосов
/ 11 июля 2011

У меня есть шаблонный класс с именем 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);
}

Теперь мой объектный код создается только один раз, но мне пришлось создать две копии одного и того же метода в моем исходном коде.Кто-нибудь знает способ обойти это?Есть ли способ развернуть обе реализации в моем объектном файле с помощью шаблонов?

1 Ответ

2 голосов
/ 11 июля 2011

Определите шаблонную функцию и используйте явную реализацию шаблона:

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>;
}

Обратите внимание, что я настоятельно рекомендую поместить это в заголовок, а вставить it!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...