模板元编程内联

时间:2012-03-02 12:52:31

标签: c++ templates

首先看看这些模板。

struct INIWindows{
    inline int GetInteger(){
        return 100;
    }
};

struct INILinux{
    inline int GetInteger(){
        return 120;
    }
};

template <class Reader>
class SettingsManager : public Reader{

};

编辑:附录,因为我不清楚我在做什么。

int main(){
    SettingsManager<INIWindows> Settings;
    printf("Integer Reads %i\n",Settings.GetInteger());
    system("pause");
    return 0;
}

我的理解是否正确,这会导致SettingsManager有一个名为get integer的内联函数,然后由编译器正确内联?

2 个答案:

答案 0 :(得分:2)

  

我的理解是否正确,这将导致SettingsManager具有一个名为get integer的内联函数,然后由编译器正确内联。

是的,您的理解是正确的。您的方法将被放置在SettingsManager类中,而不进行虚拟分派,因为基类(INIWindows和INILinux)没有虚拟方法。

inline关键字只是编译器尝试内联方法的命令 - 没有别的。没有这样做是免费的。

答案 1 :(得分:1)

inline在课堂上毫无意义。如果您已经定义了外部类的函数,那么它将指示内部链接。但是在您当前的代码中没有任何用途:类中定义的所有函数都是内联的。

对于编译器,inline只是意味着名称在编译单元外部不可见。在这方面,它与全球static类似。除此之外,编译器可以以任何方式自由地执行函数调用内联

特别是,优化器可以选择用函数的内容替换调用。这是你想要的,但它(几乎完全)与inline关键字无关,尽管它的名字。

(顺便说一句,这与模板和模板元编程无关。)