在C ++中实现函数参数的类型

时间:2014-03-25 09:31:21

标签: c++ function types parameters enforcement

我尝试实现一个函数传递一些简单的参数(例如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 ++编译器的行为并不像我想要的那样;)

有人有一个很好的解决方案吗?

1 个答案:

答案 0 :(得分:2)

编译器无法读取您的想法并知道哪个字符串包含名称以及哪个字符串包含姓氏(他们不会说英语,毕竟)。就编译器而言,两个std::string对象是可互换的(并且typedef只为类型创建别名,而不是新类型。

您可以将字符串封装在自定义类中:

struct Name {
    std::string str;
};

struct Lastname {
    std::string str;
};

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