Передача аргументов
Функция, в зависимости от принимаемого int аргумента выводит сообщение: 0-«раз», 1-«два», 2-«три». Другие значения кроме этих трёх функция принимать не может. Как реализовать это «ограничение». Язык : C++.
Ответы (4 шт):
Я бы решил это так:
#include <iostream>
using namespace std;
void print_func(unsigned par1)
{
if (par1 > 2)
{
throw runtime_error("unvalid parameter");
}
cout << par1 + 1 << endl;
}
int main()
{
print_func(0);
print_func(1);
print_func(2);
//print_func(3); - exception
system("pause");
return 1;
}
Есть еще один вариант...
В программировании очень многое решается введением уровня косвенности. Давайте введем дополнительную функцию, типа
void proxy(int x)
{
if (x >= 0 && x <= 2) func(x);
}
И вызывать будем только ее. Тоже ведь вариант — func никогда не получит на вход ничего неразрешенного :)
Но меня терзают смутные сомнения, что от вас хотят чего-то такого:
enum class VAL { _0 = 0, _1 = 1, _2 = 2 };
void func(VAL x)
{
switch(x)
{
case VAL::_0: cout << "раз"; break;
case VAL::_1: cout << "два"; break;
case VAL::_2: cout << "три"; break;
}
}
Другое дело, что это все равно не убережет от неверного вызова a la
func(static_cast<VAL>(5));
Есть и еще один вариант — класс, обеспечивающий неявное приведение в int, но, например, генерирующий исключение при передаче неподходящего значения.
Словом, увы, но при нечетко заданном ТЗ (а оно задано нечетко!) результат один — ХЗ...
Зачем все эти сложности с экзепшном и косвенностями? Если функция не может принимать никакие другие значения кроме заданного интервала, то в корректно написанной программе эти значения просто не должны ей передаваться. А для того, чтобы отловить передачу ошибочных значений на этапе отладки, специально придуманы ассерты!
#include <stdio.h>
#include <locale.h>
#include <assert.h>
void func(int val)
{
static const char* nums[] = {"раз", "два", "три"};
assert ((val>=0) && (val<3));
printf("%s\n", nums[val]);
}
int main()
{
setlocale(LC_ALL, "Russian");
func(0);
func(1);
func(2);
func(-1);
return 0;
}
Будет выведено (в отладочной сборке):
раз
два
три
Assertion failed: (val>=0) && (val<3), file main.cpp, line 9
Если условия не использовать шаблоны нет, то можно сделать просто:
void print(int I) { /*...*/ }
template <int I>
void foo() = delete;
template<>
void foo<1>() { print(1); }
И написать отдельные реализации для каждого числа от 1 до 3. Если пробрасывать туда другие числа, то просто компилироваться не будет. Но, честно говоря, проверить не могу, так как с телефона. И не уверен, что msvc пропустит.