内联类方法,用于调用其他文件的匿名命名空间中的函数

时间:2013-10-01 05:03:27

标签: c++ class namespaces hide inline

MyClass的一个重要功能是快速调用其成员之一的方法;我试着鼓励这个电话的内联。该成员的类型为Foo。我希望通过将其实现和接口放在匿名命名空间中来隐藏 Foo

以下是相关的源文件和头文件当前的设置方式......

test.h 中,我有:

struct Foo;

class MyClass {
public:
    void doStuff();
private:
    Foo f;
    inline unsigned long long int code() { return f.getCode(); }
};

test.cpp 中,我有:

namespace
{

struct Foo {
public:
    unsigned long long int getCode() {
        // ...
    }
};

} // end anon namespace

void MyClass::doStuff() {
    // do stuff, such as calling code()
}

问题当然是,在MyClass::code()的内联定义的上下文中,f不是完整类型。

在内联Foo时有没有办法隐藏MyClass::code()

1 个答案:

答案 0 :(得分:1)

如果将Foo作为指针存储在MyClass中,然后将code()的定义移动到test.cpp中,然后只调用test.cpp中的code(),则应该内联它。似乎没有理由为什么你会在另一个翻译单元中调用像code()这样的私人成员:

<强> test.h

class MyClass
{
public:
    void doStuff();
private:
    struct Foo; // nested class, you cant access 
                // it from anon namespace in test.cpp otherwise
    std::unique_ptr<Foo> f;
    inline unsigned long long int code();
};

<强> TEST.CPP

struct MyClass::Foo
{
public:
    unsigned long long int getCode()
    {
        // ...
    }
};

unsigned long long int MyClass::code()
{
    return f->getCode();
}

void MyClass::doStuff()
{
   code(); // should be inlined
}

在编译时,编译器将根据启发式分析内联任何它认为有益的函数,并且它是否可以看到函数的定义。在这种情况下哪个应该不是问题。

链接时优化通常可以更进一步,并且在编译期间定义不可见的内联函数。