Если Вы устали от оффтопиков, вот Вам простенькая задача:
Имеется шаблонная функция шаблонного класса:
template <T>
class A
{
public:
template<I>
void Func(I *pArg)
{
}
};
Незамысловатый компилятор от Майкрософт
скомпиляет такую функцию, только если она реализована
в декларации класса.
Задача. Необходимо убедить компилятор, что такую
функцию не нужно подставлять inline.
Здравствуйте Snax, Вы писали:
S>Варианты?
_forceinline — поиск в MSDN. Там есть список случаев, когда компилятор не должен делать функцию inline. Например, различная стратегия обработки исключений, переменное число аргументов...
S>Незамысловатый компилятор от Майкрософт S>скомпиляет такую функцию, только если она реализована S>в декларации класса. S>Задача. Необходимо убедить компилятор, что такую S>функцию не нужно подставлять inline.
S>Варианты?
Нет вариантов кроме как запретить inline Как таковой
Функция-метод с реализацией в описании класса это inline функция
Более того. Это один из способов делать методы inline
Здравствуйте adontz, Вы писали:
A>Нет вариантов кроме как ...
Пардон, но мы тут не о стандарте говорим, а о конкретном компиляторе, чье поведение в данной ситуации описано. Способы есть
S>Незамысловатый компилятор от Майкрософт S>скомпиляет такую функцию, только если она реализована S>в декларации класса. S>Задача. Необходимо убедить компилятор, что такую S>функцию не нужно подставлять inline.
S>Варианты?
А чем тебе не подходит такой вариант?
template <T>
class A
{
public:
template<I>
void Func(I *pArg);
};
template<I>
A::Func (I *pArg)
{
}
В этом нет ничего сложного. Просто нужно нажимать нужные клавиши в нужное время! (с) И.С. Бах
S>Незамысловатый компилятор от Майкрософт S>скомпиляет такую функцию, только если она реализована S>в декларации класса. S>Задача. Необходимо убедить компилятор, что такую S>функцию не нужно подставлять inline.
S>Варианты?
Я в работе не проверил но скомпилировалось и все такие дела:
template <class T> class A
{
public:
template<class I> void Func(I *pArg);
};
S>Незамысловатый компилятор от Майкрософт S>скомпиляет такую функцию, только если она реализована S>в декларации класса. S>Задача. Необходимо убедить компилятор, что такую S>функцию не нужно подставлять inline.
S>Варианты?
Есть идея! Необходимо как-то использовать адрес функции Func. IMHO тогда компилер не посмеет сделать ее inline.
Например, написать другую шаблонную функцию (метод), которая и будет возвращать этот адрес. Если в шаблоне A это нельзя сделать, то можно и другой шаблон создать.
Это пока все, на конкретный код у меня эрудиции сегодня не хватает
// #import <windows.bas> class IWindows9x:protected DOS { private: virtual HANDLE EnumClouds()=0; };
Здравствуйте KA, Вы писали:
KA>Есть идея! Необходимо как-то использовать адрес функции Func. IMHO тогда компилер не посмеет сделать ее inline.
Бабушка надвое сказала. Компилятор может ее продублировать.
Т.е. и отдельно положить, и в другую функцию вставить.
Так он ведет себя если виртуальную функцию определить
в декларации класса. И подставляет, если знает, что делает
, и отдельно кладет, чтобы через vtbl вызыватьможно было.
Здравствуйте __Andrey__, Вы писали:
A>Я в работе не проверил но скомпилировалось и все такие дела:
A>template <class T> class A
A>{
A>public:
A> template<class I> void Func(I *pArg);
A>};
A>template <class T>
A> template<class I>
A> void A<T>::Func(I *pArg)
A> {
A> //...
A> }
А будет ли это компиляться, если дописать
int main()
{
A<int> test;
long n;
test.func(&n);
return 0;
}
Понимаешь, компилятор способен скомпилировать
функции шаблонного класса/функции только тогда, кода ему
заданы все типы, используемые шаблоном.
S>Незамысловатый компилятор от Майкрософт S>скомпиляет такую функцию, только если она реализована S>в декларации класса. S>Задача. Необходимо убедить компилятор, что такую S>функцию не нужно подставлять inline.
S>Варианты?
Я тоже хотел это узнать в http://www.rsdn.ru/forum/?gid=9&mid=17637&tid=17558