В моем проекте C ++ я недавно наткнулся на небольшую проблему: шаблоны.
Я объявил класс Data в моем заголовочном файле (который является общим для каждого .cpp) и дал ему функцию шаблона. Я реализовал это в data.cpp. Вскоре я вспомнил, как шаблоны компилируются на месте, когда на них ссылаются, и это нарушает разделение объявления / реализации, сделанное с файлами .h и .cpp.
Итак, я подумал о небольшой работе, поставив:
class Data {
template<typename T> void myFunc(T in);
};
#define __DATA_TEMPLATE_IMPL
#include "Data.cpp"
#undef __DATA_TEMPLATE_IMPL
В header.h и:
#ifndef __DATA_TEMPLATE_IMPL
// non-template functions and other stuff....
#else
template<typename T>
void Data::myFunc(T in) {
// implementation of template function
}
#endif
Это большой обходной путь, и для компилятора он выглядит так, как будто код между #else
и #endif
перенесен в файл заголовка.
Два вопроса:
Вы видите что-нибудь не так с этим? Можете ли вы вспомнить причину, по которой это может быть неправильно, неэффективно или что-то еще?
Есть ли лучший способ (кроме фактического размещения реализации в заголовочном файле)?