如何将类的静态方法引入命名空间?

时间:2014-12-07 23:08:22

标签: c++ c++11 namespaces using-directives

例如,我有一个类A和一个静态方法foo。我有一个名称空间nm,并希望将A :: foo引入名称空间。我尝试以下

namespace nm {
    using A::foo;

    void f()
    {
        foo(...); // use A::foo
    }
}

但无法编译,因为A不是命名空间,因此using指令在这里不起作用。有没有办法实现这个想法?我想在我的GUI项目中将它用于QObject :: tr和QObject :: connect以节省一些空间。

1 个答案:

答案 0 :(得分:3)

不直接。 [namespace.udecl] / 8:

  

类成员的 using-declaration 应为 member-declaration 。 [示例:

struct X {
  int i;
  static int s;
}

void f() {
  using X::i; // error: X::i is a class member
              // and this is not a member declaration.
  using X::s; // error: X::s is a class member
              // and this is not a member declaration.
}
     

- 结束示例]

但您可以使用SFINAE模拟foo并完美转发:

template <typename... Args>
auto foo(Args&&... args)
  -> decltype(A::foo(std::forward<Args>(args)...))
{
    return    A::foo(std::forward<Args>(args)...);
}