Принудительный тип аргументов функции в переполнении стека

Я пытаюсь добиться того, чтобы функции передавались некоторые параметры, которые являются простыми (например, std :: string), но не могут быть переставлены.

Представьте себе две функции, такие как

void showFullName(std::string firstname, std::string lastname) {
cout << "Hello " << firstname << " " << lastname << endl;
}

void someOtherFunction() {
std::string a("John");
std::string b("Doe");

showFullName(a, b); // (1) OK
showFullName(b, a); // (2) I am trying to prevent this
}

Как вы можете видеть, можно смешивать порядок параметров функции — что я и пытаюсь предотвратить.

Моей первой мыслью была какая-то typedef, например

typedef std::string Firstname;
typedef std::string Lastname;

void showFullName(Firstname firstname, Lastname lastname)
//...

но (максимум GNU) компилятор c ++ не ведет себя так, как я хочу;)

У кого-нибудь есть хорошие решения для этого?

0

Решение

Компилятор не может читать ваши мысли и знать, какая строка содержит имя, а какая строка содержит фамилию (в конце концов, они не говорят по-английски). Два std::string объекты взаимозаменяемы в том, что касается компилятора (и typedef просто создает псевдоним для типа, а не нового типа).

Вы можете инкапсулировать строки в пользовательских классах:

struct Name {
std::string str;
};

struct Lastname {
std::string str;
};

void showFullName(Name name, Lastname lastname) { /* ... */ }
2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]