Войти
ПрограммированиеПодсказкиОбщееОбщее

Реализация шаблонов в .cpp-файлах

Внимание! Этот документ ещё не опубликован.

Автор:

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

// main.cpp
#include "Templ.h"

int main() {
    Templ<int> templ(0);
    Templ<float> templF(0.0f);
    Templ<double> templD(0.0);
    return 0;
}
// Templ.h
#pragma once

template <typename T>
class Templ {
public:
    Templ(T t);
private:
    T x;
};
// Templ.cpp
#include "Templ.h"

template Templ<int>;
template Templ<float>;

template <typename T>
Templ<T>::Templ(T t) : x(t) {

}
Естественно, в таком виде не скомпилируется, здесь есть небольшая ошибка.
Желаю всем километров кода)

#С++

5 января 2011

Комментарии [30]

Страницы: 1 2 3 Следующая »
#1
0:11, 6 янв. 2011

Формальное описание:
http://www.open-std.org/jtc1/sc22/open/n2356/template.html  14.7.2  Explicit instantiation                        [temp.explicit]

#2
0:58, 6 янв. 2011

Но ведь таким образом мы ограничиваем список аргументов шаблона, не?
Если где-то написать
Templ<MyType> t;
Работать ведь не будет

#3
1:02, 6 янв. 2011

Ну естественно. Компилятор ведь должен знать всё о типе, для которого будет изготовлена специализация шаблона.
Придётся так:

#include "Templ.h"

#include "MyType.h"

template Templ<MyType>;
Собственно, всё стандартно.
Суть-то в том, чтобы уменьшить время компиляции и не захламлять заголовочные файлы определениями функций (мне, например, это неудобно).

#4
9:14, 6 янв. 2011

Sasha7b9
> Естественно, в таком виде не скомпилируется, здесь есть небольшая ошибка.
  Если ошибка в том, что инстанцировать шаблоны надо конструкцией

template class Templ<int>;
и после определения его функций, то кто мешает её исправить?
#5
17:04, 7 янв. 2011
Ну это, извините, детский сад уже какой-то.

Толку от этой штуки, если для использования библиотеки с шаблонами в нее придется включать свои типы(т.е. овер 9000 строк кода), а потом перекомпилировать?
#6
18:10, 7 янв. 2011

> и не захламлять заголовочные файлы определениями функций

#ifndef MYTMP_H
#define MYTMP_H

template< class T >
class MyTmp{
  public:
    void foo();
  };
  
#include "mytmp.cpp"

#endif  //MYTMP_H
#ifndef MYTMP_CPP
#define MYTMP_CPP

#include "mytmp.h"

template< class T >
void MyTmp<T>::foo(){
  //code
  }

#endif  //MYTMP_CPP

#7
10:12, 10 янв. 2011

Zefick
> Если ошибка в том, что инстанцировать шаблоны надо конструкцией
> template class Templ<int>;
> и после определения его функций, то кто мешает её исправить?

Не знаю. Может быть, то, что учебный пример должен быть с ошибкой.

#8
10:16, 10 янв. 2011

Fla
> Толку от этой штуки, если для использования библиотеки с шаблонами в нее придется включать свои типы(т.е. овер 9000 строк кода), а потом перекомпилировать?
Ну, в сложных проектах, может быть, толку и немного, а в проэктах попроще вполне сгодится.

Вот интересно, хоть один положительный отзыв о подсказке будет?)

#9
10:30, 10 янв. 2011

Sasha7b9
> Вот интересно, хоть один положительный отзыв о подсказке будет?)

Думаю нет, фича какаято сомнительная... :)

#10
12:14, 10 янв. 2011

Executor
> Думаю нет, фича какаято сомнительная... :)
давно явное инстанцирование шаблона стало сомнительной фичей?

#11
12:43, 10 янв. 2011

Suslik
> давно явное инстанцирование шаблона стало сомнительной фичей?

Что тебе мешает это делать в h файле?

#12
13:01, 10 янв. 2011

Executor
инстанс шаблона должен быть в той единице компиляции, в которой находится его реализация. в хедере или в cpp - не имеет значения.

#13
13:08, 10 янв. 2011

Шаблоны - зло.

#14
13:27, 10 янв. 2011

Gladiator
одноклассникам расскажешь...
есть задачи в которых с ними лучше чем без них, почему бы не использовать?

Страницы: 1 2 3 Следующая »
ПрограммированиеПодсказкиОбщееОбщее

Тема в архиве.