0

私は、関数がすべて単純ないくつかのパラメーター (std::string など) を渡されるが、置換できないことを達成しようとしています。

次のような 2 つの関数を想像してください。

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++ コンパイラは、私が望むように動作しません ;)

誰かがこれに対する良い解決策を持っていますか?

4

1 に答える 1

2

コンパイラはあなたの心を読むことができず、どの文字列が名前を保持し、どの文字列が姓を保持しているかを知ることはできません (結局、彼らは英語を話せません)。std::stringコンパイラに関する限り、2 つのオブジェクトは交換可能です (また、typedefは新しい型ではなく、型のエイリアスを作成するだけです)。

カスタム クラスで文字列をカプセル化できます。

struct Name {
    std::string str;
};

struct Lastname {
    std::string str;
};

void showFullName(Name name, Lastname lastname) { /* ... */ }
于 2014-03-25T09:37:47.540 に答える