using-directive类静态函数?

时间:2011-05-21 17:00:01

标签: c++ class namespaces

我使用的API在名为TCODConsole的类中具有很多的函数作为静态函数。现在我认为它在命名空间中,所以我写道:using namespace TCODConsole;。然后我发现TCODConsole不是命名空间,而是一个类。

有没有办法以与使用using namespace类似的方式导入这些功能?

4 个答案:

答案 0 :(得分:3)

不,没有快捷方式可以拨打myStaticFun()而不是MyClass::myStaticFun()。你不能用课来做到这一点。它是一个类,而不是命名空间。但你可以像包装一样写东西。也就是说,您将添加具有相同名称的函数,并从该函数中调用静态方法。像这样:

class MyClass {
    static void fun();
};

void fun() {
    MyClass::fun();
}

// call it
fun();

不是很好的方法。就个人而言,我认为最好坚持上课而不是这样做。

答案 1 :(得分:2)

我想不出一个干净的方法,但我能想到一个有点丑陋的黑客,只要使用它的代码是一个类的一部分(如果TCODConsole确实包含只有静态成员函数)。假设您是bar(),类Foo的成员函数,并且您想要调用函数baz(),它是TCODConsole的静态成员,而不完全限定它。你可以做的是私下从TCODConsole派生Foo:

class Foo : private TCODConsole
{
    void bar()
    {
        baz();
    }

};
是的,那很难看。 :(

如果你想使用Boost.PP(Boost预处理器宏库 - 你不需要编译或包含来自Boost的任何其他东西来使用它),你可能会做一个不那么丑陋但是更复杂的宏它将为你“导入”这些函数,方法是将内联函数包装在另一个命名空间中(然后可以随意导入)。它仍然需要您明确指定要“导入”的每个函数的名称,因此您的代码(减去宏)将如下所示:

namespace TCODStatic
{
    IMPORT_FROM_TCOD(foo)
    IMPORT_FROM_TCOD(bar)
    IMPORT_FROM_TCOD(baz)
    IMPORT_FROM_TCOD(spaz)
}

然后您就可以在任何地方写using namespace TCODStatic;

答案 2 :(得分:2)

虽然我可能会误解这个问题, 如果缩短资格是目标, typedef像下面的那样符合目的吗?

struct TCODConsole {
  static void f();
  static void g();
};

int main() {
  typedef TCODConsole T;
  T::f();
  T::g();
}

或者,如果可以实例化类TCODConsole, 因为static成员函数可以用相同的形式调用 非静态成员函数,以下代码可能符合目的:

int main() {
  TCODConsole t;
  t.f();
  t.g();
}

答案 3 :(得分:0)

简短回答:不是没有使用宏。 C ++语言中没有适当的机制来做这样的事情:

class A
{
public:
  static void foo();
};

// ...

using A;
foo();

您可以使用宏为您构建这些表达式:

#define FOO() (A::foo())

FOO();
然而,我会劝阻这一点,因为它可以成为一个维持性的噩梦是你广泛使用这些宏。你最终得到这样的代码:

FOO();
BAR();
SUPERGIZMO(a, b, c);

...这些东西都没有被定义为程序中任何地方的头等名字。您丢失了所有类型检查,代码使用了只有您知道的“秘密语言”,并且调试,扩展和修复变得困难。

编辑:

你可以写一种桥梁。像这样:

class FooBar
{
public: 
  static void gizmo();
};

namespace Foo
{
  void gizmo() { FooBar::gizmo(); };
};

using namespace Foo;

gizmo();
相关问题