Шаблон метапрограммирование встраивание - PullRequest
0 голосов
/ 02 марта 2012

Сначала посмотрите на эти шаблоны.

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 ]

2 голосов
/ 02 марта 2012

Правильно ли я понимаю, что это приведет к тому, что в SettingsManager будет встроенная функция get integer, которая затем корректно будет встроена компилятором.

Да, ваше понимание верно.Ваши методы будут помещены в класс SettingsManager без виртуальной отправки, поскольку базовые классы (INIWindows и INILinux) не имеют виртуальных методов.

Ключевое слово inline является только командой для компиляторапопытаться встроить метод - больше ничего.Это бесплатно не делать это.

1 голос
/ 02 марта 2012

inline не имеет смысла внутри класса. Если бы вы определили функции вне класса, то это указывало бы на внутреннюю связь. Но в вашем текущем коде нет никакой цели: все функции, определенные в классе, являются встроенными.

Для компилятора inline просто означает, что имя не видно за пределами модуля компиляции. В этом отношении он похож на глобальный static. Кроме этого, компилятор может свободно выполнять вызов функции, вставляя любым удобным для него способом.

В частности, оптимизатор может выбрать замену вызова содержимым функции. Это то, что вам нужно, но оно (почти полностью) не связано с ключевым словом inline, несмотря на его название.

(Кстати, это не имеет отношения к шаблонам и метапрограммированию шаблонов.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...