2011-04-01 23 views
3

我知道using std::swap的技巧,通过ADL启用用户定义的swap函数,但我并不知道这应该也应用于其他一些函数。比如我在模板代码编写滥用std::abs wheras我应该用这样的:“使用”的候选标准函数

template <class Int> void f(Int i) { 
    using std::abs; 
    Int j = abs(i); 
    // ... 
} 

你能想到什么标准功能,应使用这种方式?

在一个侧面说明:包括cstdlib当G ++把abs在全局命名空间(实际上ctsdlib包括stdlib.h(其定义功能abs),并做了#undef abs ...),并在标准说什么?

+1

目前的标准说''应该只提供命名空间内的函数。新的C++ 11标准将允许g ++(和大多数其他编译器)已经做的事情。 – 2011-04-01 09:40:21

回答

1

这是从标准:

3.4.6 using指令和命名空间别名
[basic.lookup.udir]
当在查找一个命名空间名称使用指示符或 namespace-alias-definition,只考虑命名空间 名称。

因此,您可以使用关键字using将变量,类型和函数导入当前名称空间。


编辑

您可以导入任何你喜欢到当前的命名空间,但你应该关心的命名空间polution,因此尽量不要在头使用using,但只在源文件中。

理想情况下,您不应该使用此关键字。我有时使用它,当我有深层嵌套的命名空间。

+0

这回答什么可以导入使用'使用',而不是什么 – 2011-04-01 09:19:11

+0

@jk正确的,因为这取决于个人喜好和编码标准。无论如何,我扩展我的答案 – 2011-04-01 09:24:07

+0

为'std :: abs'示例,它不是我喜欢导入它,但我_have to_(除非存在另一种解决方案?)为了我的代码编译与类似于整型的类型,对于std库是未知的,但它们提供它们自己的'abs'版本。 – rafak 2011-04-01 10:14:39