【问题标题】:Argument-dependent Name Lookup: add extra namespace to look into依赖于参数的名称查找:添加额外的名称空间以查看
【发布时间】:2012-07-27 13:19:51
【问题描述】:

我想利用 ADL 规则检查额外命名空间中的函数:

假设我们有一个class X。

class X
 {
 ...
 };

在通话中

X x;
f(x);

我希望编译器查看namespace funky,直到现在它与class X 无关。但我不想在每次调用f 时输入funky::f 来弄乱编码。

实现此目的的一种方法是将class X 定义为模板类,其参数来自namespace funky。

template <typename Fake = funky::someClassFromFunky>
class X
 {
 ...
 };

对于调用f(x),现在,编译器确实会寻找funky::f。

是否有更清洁/更简单的方法来实现相同的行为? (特别是在class X 的声明中引用一些任意的类someClassFromFunky 很尴尬。)

【问题讨论】:

    标签: c++ namespaces argument-dependent-lookup name-lookup


    【解决方案1】:

    您可以像这样将 f 导入您的命名空间:

    using funky::f;
    

    【讨论】:

    • 这是正确答案。需要注意的关键是您可以在调用点执行此操作,而不仅仅是全局。
    • 我的问题是我有相当多的 funky 函数,在 X 类上运行,我想使用它们(不仅仅是 f,而是说 ~ 15 个不同的函数)。为每个函数添加 using 语句会很烦人。
    • @MattHurst:我建议为每一个做一个 using 声明,将它们放在一起。这样,如果您正在搜索函数名称,很容易发现它是从另一个命名空间导入的。
    • 另外,这样的 using 语句会导致不同的行为。对于using,编译器还会考虑使用funky::f 调用int y; f(y);。
    • @Matt:但是,如果X 在它自己的命名空间中,并且您将using 放入该命名空间,那么只有在您调用f(X) 时才会考虑它
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-19
    相关资源
    最近更新 更多