我使用的API在名为TCODConsole
的类中具有很多的函数作为静态函数。现在我认为它在命名空间中,所以我写道:using namespace TCODConsole;
。然后我发现TCODConsole
不是命名空间,而是一个类。
有没有办法以与使用using namespace
类似的方式导入这些功能?
答案 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();