c ++: использование безопасности типов для различения типов двух аргументов int - PullRequest
8 голосов
/ 12 января 2011

У меня есть различные функции с двумя аргументами типа int (я сам пишу как функции, так и вызывающий код). Я боюсь запутать порядок аргументации в некоторых звонках.

Как я могу использовать безопасность типов, чтобы компилятор предупреждал меня или выдавал ошибку, если я вызываю функцию с неправильной последовательностью аргументов (все аргументы - int)?

Я пробовал typedefs: Typedef не вызывает никаких предупреждений или ошибок компилятора:

typedef int X; typedef int Y; 

void foo(X,Y); 

X x; Y y; 

foo(y,x); // compiled without warning)

Ответы [ 3 ]

12 голосов
/ 12 января 2011

Вам нужно будет создать классы-оболочки.Допустим, у вас есть две разные единицы (скажем, секунды и минуты), обе из которых представлены в виде целых.Вам нужно что-то вроде следующего, чтобы быть полностью безопасным:

class Minute
{
public:
    explicit Minute(int m) : myMinute(m) {}
    operator int () const { return myMinute; }

private:
    int myMinute;
};

и похожий класс на несколько секунд.Явный конструктор предотвращает случайное использование int в качестве Minute, но оператор преобразования позволяет использовать Minute везде, где вам нужно int.

4 голосов
/ 12 января 2011

typedef создает псевдонимы типов.Как вы обнаружили, там нет безопасности типов.

Одна возможность, в зависимости от того, чего вы пытаетесь достичь, это использовать enum.Это тоже не совсем безопасно, но ближе.Например, вы не можете передать int в параметр enum без его приведения.

0 голосов
/ 13 января 2011

Получите заметку. Напишите на нем большими буквами: «ПЕРВЫЙ Х! ТО, ДА!» Прикрепите его к экрану вашего компьютера. Я, честно говоря, не знаю, что еще посоветовать. Использование классов-обёрток наверняка излишне, когда проблему можно решить с помощью post-it и магического маркера.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...