Я знаю о процессе перегрузки функций в C ++ посредством использования различных параметров и определений. Однако, если у меня есть две функции, которые идентичны, кроме их параметров, есть способ получить это определение только один раз.
Функции, которые я использовал, должны проверять правильность ввода (т.е. вводится число, а не символ). Один для int, а другой для поплавка. Из-за этого и того факта, что я передаю переменную по ссылке, определения абсолютно идентичны.
Ниже описаны две функции:
void Input (float &Ref);
void Input (int &Ref);
И тогда они разделяют общее определение:
Function_Header
{
static int FirstRun = 0; // declare first run as 0 (false)
if (FirstRun++) // increment first run after checking for true, this causes this to be missed on first run only.
{ //After first run it is required to clear any previous inputs leftover (i.e. if user entered "10V"// previously then the "V" would need to be cleared.
std::cin.clear(); // clear the error flags
std::cin.ignore(INT_MAX, '\n'); // discard the row
}
while (!(std::cin >> Ref)) // collect input and check it is a valid input (i.e. a number)
{ // if incorrect entry clear the input and request re-entry, loop untill correct user entry.
std::cin.clear(); // clear the error flags
std::cin.ignore(INT_MAX, '\n'); // discard the row
std::cout << "Invalid input! Try again:\t\t\t\t\t";
}
}
Если бы был способ обойти две одинаковые копии одного и того же кода, в то время как он все еще использовался для обоих типов параметров, я мог бы значительно сократить код моей программы. Я уверен, что я не единственный человек с этой проблемой, но все мои поиски возвращаются, объяснения того, как перегружать функции, используя несколько определений.
Любая помощь или совет будет высоко ценится.
Шаблоны полезны:
template <typename T>
void Input (T &Ref)
{
...
}std::string s;
int i;
float f;
Input(s);
Input(i);
Input(f);
Лучшее (и единственное?) Решение — использовать шаблон
template<class T>
void Input(T& ref)
{
..
}