2016-11-25 87 views
1

内置类型(以及来自std的类型)被用作函数和构造函数的参数,而不是每个类型的实例都是有效的输入。我应该使用强类型来确保编译时的正确性?

例子:

// There is no guarantee that url is actually a url 
void make_http_request(const std::string& url); 

// Here we know that it must be a url 
void make_http_request(const url& url); 

// There is no way of knowing if this is the correct mutex to lock 
void insert_into_db(std::mutex mutex); 

// Here we know we have the correct mutex 
void insert_into_db(db_mutex mutex); 

这当然不应该被用于对象,你不拥有控制权的属性。例如,您可以创建一个类connected_socket,但如果对等关闭连接,则该类成为谬论。然而,它可以用来确保IPv4 UDP套接字永远不会尝试到IPv6端点sendto()

你做得越多,你就越能确保你的程序在编译时有效(谁不喜欢那样?)。这种做法有什么问题吗?它会被认为是好的吗?有什么缺点,他们会值得吗?

原谅我,如果这是一个概念,通过另一个名称,我只是无法找到它。

+0

你有你的问题的方式,很难客观回答。 –

+0

@VaughnCato我很害怕这个。尽管如此,我还是想讨论一下这个社区的反馈意见。如果这不是正确的地方,请将我引导到更合适的地方。 –

+0

在你的例子中,你将如何确保'url'实际上包含一个url?否则,我看不到太多的好处... –

回答

3

有一个在C++ Core Guidelines这个guideline

I.4:请准确接口和强类型

原因

类型是最简单也是最好的文档,具有明确意思,并保证在编译时检查。而且,精确键入的代码通常会更好地优化。

它给出了一些例子。它并没有真正谈论多远太远了。

相关问题