【问题标题】:Enforcing type of function arguments in C++在 C++ 中强制执行函数参数的类型
【发布时间】:2014-03-25 09:31:20
【问题描述】:

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

有人对此有好的解决方案吗?

【问题讨论】:

  • 你的意思是class Firstname : public std::string {};
  • @AbhishekBansal 不! 标准库项目不是为继承而设计的。永远不要那样做。
  • 我知道这是矫枉过正。另一种方法是创建一个以名字和姓氏为字段的类 Person。
  • @Manu343726:为什么不呢?
  • @Abhishek Bansal:但是......想象 firstname 和 lastname 本身将是一个类的字段,例如类人。这里有很多课程只是为了一件简单的事情:-|

标签: c++ function types parameters enforcement


【解决方案1】:

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

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

struct Name {
    std::string str;
};

struct Lastname {
    std::string str;
};

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

【讨论】:

  • 很好,但是想象一下 Firstname 和 Lastname 是一个类的元素(例如class Person)。你知道有什么方法可以让它变得更简单吗?也许void showFullName(class Person::Firstname firstname, class Person::Lastname lastname)
猜你喜欢
  • 2020-05-12
  • 2018-05-08
  • 2016-08-13
  • 1970-01-01
  • 2018-09-26
  • 2021-08-23
  • 2018-01-19
  • 1970-01-01
  • 2021-04-02
相关资源
最近更新 更多