Я пытаюсь добиться того, чтобы функции передавались некоторые параметры, которые являются простыми (например, 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 ++ не ведет себя так, как я хочу;)
У кого-нибудь есть хорошие решения для этого?
Компилятор не может читать ваши мысли и знать, какая строка содержит имя, а какая строка содержит фамилию (в конце концов, они не говорят по-английски). Два std::string
объекты взаимозаменяемы в том, что касается компилятора (и typedef
просто создает псевдоним для типа, а не нового типа).
Вы можете инкапсулировать строки в пользовательских классах:
struct Name {
std::string str;
};
struct Lastname {
std::string str;
};
void showFullName(Name name, Lastname lastname) { /* ... */ }
Других решений пока нет …