Я учусь использовать функции шаблонов и организовывать свой код в несколько файлов. Я просмотрел Почему шаблоны могут быть реализованы только в заголовке file?, где они указывают, что я должен реализовать свои функции-шаблоны в заголовке; Я также посмотрел на встроенные функции C ++: объявить как таковое, определить как таковое или и то, и другое? Почему?, чтобы я знал, что мне следует определять полностью специализированные функции как встроенные в заголовок; и я посмотрел Зачем использовать файл «tpp» при реализации шаблонных функций и классов, определенных в заголовке?, где они предлагают определить шаблоны (а также полностью специализированные шаблоны?) в отдельном my.tpp
и добавить #include "my.tpp"
в конец моего заголовка.
Теперь мой вопрос как новичка: как мне совместить все это с обычными функциями.
Представьте себе следующее:
#ifndef IVAL_H
#define IVAL_H
//Function to determine if input string is of a given type
template<typename T>
bool is_type(std::string);
//Specialization when testing integer
//As I also want to accept e.g. 4.0000 as an integer
template<>
bool is_type<int>(std::string);
//Function to get a given type
template<typename T>
T get_type(std::string);
//Finally a normal function to ask for [y/n]
bool yesNo(std::string prompt);
//Include templates definitions
#include"ival.tpp"
#endif /*IVAL_H*/
Затем, как было предложено в приведенных выше вопросах:
//in ival.tpp
#ifndef IVAL_TPP
#define IVAL_TPP
template<typename T>
bool is_type(std::string input)
{
//How to validate input
}
template<>
bool inline is_type<int>(std::string input)
{
\\How to validate when integer
}
template<typename T>
T get_type(std::string prompt)
{
//How to keep asking until valid input
//Using is_type
}
#endif /*IVAL_H*/
И, наконец, как .cpp
моя обычная функция:
//in ival.cpp
#include "ival.h"
bool yesNo(std::string prompt)
{
//How to ask for [y/n]
//Using get_type<char>
}
Это вызывает некоторую путаницу в том, как правильно организовать мои функции. Когда в заголовке есть как функции шаблона, так и обычные функции, нормально ли делать то, что я сделал выше? (другой исходный файл для обычных функций) - это полностью специализированные функции, рассматриваемые как шаблон (т.е. определенные встроенными в файл, где находятся все шаблоны) или как функция (т.е. определенные только в .cpp, как и все другие функции).
Мне было удобнее определять функции шаблона в .cpp и явно создавать экземпляры в char, int, double, float
и std::string
#include
в этом заголовке, или что включает файл, который включает этот заголовок, и т. Д. Если вы измените что-то в исходном файле (файл no другой файл должен включать), тогда вам нужно только перекомпилировать этот один файл и заново связать все. Поместите как можно больше в исходные файлы, чтобы ограничить время компиляции. Изменить: некоторым компиляторам может быть сложно оптимизировать исходные файлы, хотя другие могут утверждать, что встроенные функции (в заголовках) лучше для оптимизации (я не согласен). - person François Andrieux   schedule 11.02.2019