Я учусь использовать функции шаблонов и организовывать свой код в несколько файлов.Я посмотрел на Почему шаблоны могут быть реализованы только в заголовочном файле? , где они указывают, что я должен реализовать свои функции шаблона в заголовке;Я также посмотрел на встроенные функции 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