Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«C++. Π‘Π±ΠΎΡ€Π½ΠΈΠΊ Ρ€Π΅Ρ†Π΅ΠΏΡ‚ΠΎΠ²Β». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 31

Автор Π”. БтСфСнс

ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Π²Ρ‹ Π½Π΅ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ соглашСниС ΠΎΠ± ΠΈΠΌΠ΅Π½Π°Ρ… Boost, Π° строка

#include <boost/config/auto_link.hpp>

Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ pragma comment для ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‰ΠΈΡ… Π΅Π΅ компиляторов.

Π‘ΠΌΠΎΡ‚Ρ€ΠΈ Ρ‚Π°ΠΊΠΆΠ΅

Π Π΅Ρ†Π΅ΠΏΡ‚ 1.23.

1.26. ИспользованиС экспортируСмых шаблонов

ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΠ°

Π’Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΡΠΎΠ±Ρ€Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰ΡƒΡŽ экспортируСмыС ΡˆΠ°Π±Π»ΠΎΠ½Ρ‹, Ρ‡Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΎΠ½Π° ΠΎΠ±ΡŠΡΠ²Π»ΡΠ΅Ρ‚ ΡˆΠ°Π±Π»ΠΎΠ½Ρ‹ Π² Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»Π°Ρ… с использованиСм ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ³ΠΎ слова export, Π° рСализация шаблонов находится Π² Ρ„Π°ΠΉΠ»Π°Ρ… .cpp.

РСшСниС

Π’ΠΎ-ΠΏΠ΅Ρ€Π²Ρ‹Ρ…, скомпилируйтС Π² ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹ Ρ„Π°ΠΉΠ»Ρ‹ .cpp, содСрТащиС Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ шаблонов, ΠΏΠ΅Ρ€Π΅Π΄Π°Π² компилятору ΠΎΠΏΡ†ΠΈΡŽ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡƒΡŽ для Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ экспортируСмых шаблонов. Π—Π°Ρ‚Π΅ΠΌ скомпилируйтС ΠΈ скомпонуйтС Ρ„Π°ΠΉΠ»Ρ‹ .cpp, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰ΠΈΠ΅ экспортируСмыС ΡˆΠ°Π±Π»ΠΎΠ½Ρ‹, ΠΏΠ΅Ρ€Π΅Π΄Π°Π² компилятору ΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²Ρ‰ΠΈΠΊΡƒ ΠΎΠΏΡ†ΠΈΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Π΅ для Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ экспортируСмых шаблонов, Π° Ρ‚Π°ΠΊΠΆΠ΅ ΠΎΠΏΡ†ΠΈΠΈ, ΡƒΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‰ΠΈΠ΅ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ, содСрТащиС Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ шаблонов.

ΠžΠΏΡ†ΠΈΠΈ для Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ экспортируСмых шаблонов ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Ρ‹ Π² Ρ‚Π°Π±Π» 1.39. ΠžΠΏΡ†ΠΈΠΈ для указания располоТСния Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΉ шаблонов ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Ρ‹ Π² Ρ‚Π°Π±Π». 1.40. Если ваш инструмСнтарий Π² этой Ρ‚Π°Π±Π»ΠΈΡ†Π΅ Π½Π΅ ΡƒΠΊΠ°Π·Π°Π½, Ρ‚ΠΎ ΠΎΠ½, скорСС всСго, Π½Π΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ экспортируСмых шаблонов.


Π’Π°Π±Π». 1.39. ΠžΠΏΡ†ΠΈΠΈ для Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ экспортируСмых шаблонов

Π˜Π½ΡΡ‚Ρ€ΡƒΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ Π‘Ρ†Π΅Π½Π°Ρ€ΠΈΠΉ Comeau (Unix) -export, -A ΠΈΠ»ΠΈ -strict Comeau (Windows) -export ΠΈΠ»ΠΈ -A Intel (Linux) -export ΠΈΠ»ΠΈ -strict-ansiΒΉ

ΒΉ ВСрсии компилятора Intel для Linux Π΄ΠΎ 9.0 использовали ΠΎΠΏΡ†ΠΈΡŽ -strict_ansi


Π’Π°Π±Π». 1.40. ΠžΠΏΡ†ΠΈΠΈ, ΡƒΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‰ΠΈΠ΅ располоТСниС Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΉ шаблонов

Π˜Π½ΡΡ‚Ρ€ΡƒΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ Π‘Ρ†Π΅Π½Π°Ρ€ΠΈΠΉ Comeau -template_directory=<path> Intel (Linux) -export_dir<path>

НапримСр, ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Ρ‡Ρ‚ΠΎ Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΡΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ, ΠΏΠΎΠΊΠ°Π·Π°Π½Π½ΡƒΡŽ Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ 1.27. Она содСрТит Ρ‚Ρ€ΠΈ Ρ„Π°ΠΉΠ»Π°.

β€’ Π€Π°ΠΉΠ» plus.hpp содСрТит объявлСниС экспортируСмого шаблона Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ plus().

β€’ Π€Π°ΠΉΠ» plus.cpp содСрТит ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ plus().

β€’ Π€Π°ΠΉΠ» test.cpp Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ объявлСниС β€” Π½ΠΎ Π½Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ β€” plus() ΠΈ опрСдСляСт Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ main(), ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰ΡƒΡŽ plus().

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 1.27. ΠŸΡ€ΠΎΡΡ‚Π°Ρ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰Π°Ρ экспортируСмыС ΡˆΠ°Π±Π»ΠΎΠ½Ρ‹


plus.hpp:

#ifndef PLUS_HPP_INCLUDED

#define PLUS_HPP_INCLUDED


export template<typename T>

T plus(const T& lhs, const T& rhs);


#endif // #ifndef PLUS_HPP_INCLUDED


plus.cpp:

#include "plus.hpp"


template<typename T>

T plus(const T& lhs, const T& rhs) {

 return rhs + lhs;

}


test.cpp:

#include <iostream>

#include "plus.hpp"


int main() {

 std::cout << "2 + 2 = " << plus(2, 2) << "\n";

}

Π§Ρ‚ΠΎΠ±Ρ‹ ΡΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ plus.cpp Π² ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» plus.obj с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Comeau Π² Unix, ΠΏΠ΅Ρ€Π΅ΠΉΠ΄ΠΈΡ‚Π΅ Π² Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΡŽ, ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‰ΡƒΡŽ plus.cpp, plus.hpp ΠΈ test.cpp, ΠΈ Π²Π²Π΅Π΄ΠΈΡ‚Π΅ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ.

$ como -c --export plus.cpp

Π­Ρ‚Π° ΠΊΠΎΠΌΠ°Π½Π΄Π° Ρ‚Π°ΠΊΠΆΠ΅ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ Ρ„Π°ΠΉΠ» plus.et, ΠΎΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‰ΠΈΠΉ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ шаблона, содСрТащСгося Π² plus.cpp.

Для развлСчСния ΠΎΡ‚ΠΊΡ€ΠΎΠΉΡ‚Π΅ plus.et Π² тСкстовом Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€Π΅.

Π—Π°Ρ‚Π΅ΠΌ скомпилируйтС test.cpp Π² ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» test.obj с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹:

$ como -c --export test.cpp

НаконСц, скомпонуйтС исполняСмый Ρ„Π°ΠΉΠ» test.exe.

$ como --export -ΠΎ test test.obj

Π”Π²Π΅ послСдниС ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½ΠΈΡ‚ΡŒ Π² ΠΎΠ΄Π½Ρƒ.

$ como --export -o test test.cpp

Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ test.exe.

$ ./test

2 + 2 = 4

Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚Π΅, Ρ‡Ρ‚ΠΎ Ρ„Π°ΠΉΠ»Ρ‹ plus.hpp ΠΈ plus.cpp находятся Π² Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ с ΠΈΠΌΠ΅Π½Π΅ΠΌ plus, a test.cpp находится Π² Π΄ΠΎΡ‡Π΅Ρ€Π½Π΅ΠΉ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ test. Π§Ρ‚ΠΎΠ±Ρ‹ ΡΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈ ΡΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²Π°Ρ‚ΡŒ test.cpp, ΠΏΠ΅Ρ€Π΅ΠΉΠ΄ΠΈΡ‚Π΅ Π² Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΡŽ test ΠΈ Π²Π²Π΅Π΄ΠΈΡ‚Π΅:

$ como --export --template_directory=../plus -I../plus -o test

test.cpp

ΠžΠ±ΡΡƒΠΆΠ΄Π΅Π½ΠΈΠ΅

C++ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ Π΄Π²Π΅ ΠΌΠΎΠ΄Π΅Π»ΠΈ обСспСчСния ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΉ шаблонов Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΈ статичСских Π΄Π°Π½Π½Ρ‹Ρ…-Ρ‡Π»Π΅Π½ΠΎΠ² шаблонов классов: Π²ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‰ΡƒΡŽ (inclusion model) ΠΈ Ρ€Π°Π·Π΄Π΅Π»ΡŒΠ½ΡƒΡŽ (separation model) ΠΌΠΎΠ΄Π΅Π»ΠΈ. Π’ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‰Π°Ρ модСль Π·Π½Π°ΠΊΠΎΠΌΠ° всСм программистам, рСгулярно ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰ΠΈΠΌ ΡˆΠ°Π±Π»ΠΎΠ½Ρ‹ Π‘++, Π½ΠΎ часто оказываСтся нСпонятной программистам, ΠΏΡ€ΠΈΠ²Ρ‹ΠΊΡˆΠΈΠΌ ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΊΠΎΠ΄ Π±Π΅Π· шаблонов. Π’ΠΎ Π²ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‰Π΅ΠΉ ΠΌΠΎΠ΄Π΅Π»ΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ шаблона Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ β€” ΠΈΠ»ΠΈ статичСских Π΄Π°Π½Π½Ρ‹Ρ…-Ρ‡Π»Π΅Π½ΠΎΠ² шаблона класса β€” Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π²ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒΡΡ Π² ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ исходный Ρ„Π°ΠΉΠ», Π΅Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰ΠΈΠΉ. Π’ ΠΏΡ€ΠΎΡ‚ΠΈΠ²ΠΎΠΏΠΎΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ этому ΠΏΡ€ΠΈ использовании Π½Π΅ΡˆΠ°Π±Π»ΠΎΠ½Π½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΈ Π΄Π°Π½Π½Ρ‹Ρ… достаточно Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ Π² исходный Ρ„Π°ΠΉΠ» Ρ‚ΠΎΠ»ΡŒΠΊΠΎ объявлСниС; ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΠΎΠΌΠ΅Ρ‰Π΅Π½ΠΎ Π² ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» .cpp.

РаздСльная модСль Π±Π»ΠΈΠΆΠ΅ ΠΊ Ρ‚Ρ€Π°Π΄ΠΈΡ†ΠΈΠΎΠ½Π½ΠΎΠΉ ΠΌΠ°Π½Π΅Ρ€Π΅ ΠΎΡ€Π³Π°Π½ΠΈΠ·Π°Ρ†ΠΈΠΈ исходного ΠΊΠΎΠ΄Π° C++. Для шаблонов, ΠΎΠ±ΡŠΡΠ²Π»Π΅Π½Π½Ρ‹Ρ… с ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹ΠΌ словом export, Π½Π΅ трСбуСтся Π²ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒ опрСдСлСния Π²ΠΎ всС исходныС Ρ„Π°ΠΉΠ»Ρ‹, ΠΈΡ… ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰ΠΈΠ΅. ВмСсто этого опрСдСлСния ΠΏΠΎΠΌΠ΅Ρ‰Π°ΡŽΡ‚ΡΡ Π² ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹ .cpp. Однако ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒ с Ρ‚Ρ€Π°Π΄ΠΈΡ†ΠΈΠΎΠ½Π½ΠΎΠΉ ΠΎΡ€Π³Π°Π½ΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ ΠΊΠΎΠ΄Π° Π½Π΅ полная, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ Π΄Π°ΠΆΠ΅ нСсмотря Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ ΠΊΠΎΠ΄, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰ΠΈΠΉ экспортируСмый шаблон, Π½Π΅ Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ Π΅Π³ΠΎ опрСдСлСния, ΠΎΠ½ зависит ΠΎΡ‚ опрСдСлСния.

РаздСльная модСль ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Π΅Ρ‚ нСсколько ΠΏΠΎΡ‚Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Ρ… прСимущСств.

УмСньшСниС Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ компиляции

ВрСмя компиляции ΠΏΡ€ΠΈ использовании Ρ€Π°Π·Π΄Π΅Π»ΡŒΠ½ΠΎΠΉ ΠΌΠΎΠ΄Π΅Π»ΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΠΊΡ€Π°Ρ‚ΠΈΡ‚ΡŒΡΡ благодаря Ρ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ сканированиС ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΉ шаблонов производится Ρ€Π΅ΠΆΠ΅, ΠΈ ΠΏΠΎΡ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ Ρ€Π°Π·Π΄Π΅Π»ΡŒΠ½Π°Ρ модСль ΡƒΠΌΠ΅Π½ΡŒΡˆΠ°Π΅Ρ‚ зависимости ΠΌΠ΅ΠΆΠ΄Ρƒ модулями.

Π‘Π½ΠΈΠΆΠ΅Π½ΠΈΠ΅ «загрязнСния» символов

ИмСна Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, классов ΠΈ Π΄Π°Π½Π½Ρ‹Ρ…, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Ρ… Π² Ρ„Π°ΠΉΠ»Π΅ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ шаблона, ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ скрыты ΠΎΡ‚ ΠΊΠΎΠ΄Π°, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰Π΅Π³ΠΎ этот шаблон, Ρ‡Ρ‚ΠΎ сниТаСт Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ случайного совпадСния ΠΈΠΌΠ΅Π½. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, Π°Π²Ρ‚ΠΎΡ€ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ шаблона ΠΌΠΎΠΆΠ΅Ρ‚ ΡƒΠ΄Π΅Π»ΡΡ‚ΡŒ мСньшС внимания случайным совпадСниям с ΠΈΠΌΠ΅Π½Π°ΠΌΠΈ ΠΈΠ· исходных Ρ„Π°ΠΉΠ»ΠΎΠ², ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰ΠΈΡ… шаблон

Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΏΠΎΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ скомпилированныС Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ шаблонов.

ВСорСтичСски ΠΏΡ€ΠΈ использовании Ρ€Π°Π·Π΄Π΅Π»ΡŒΠ½ΠΎΠΉ ΠΌΠΎΠ΄Π΅Π»ΠΈ поставщик ΠΌΠΎΠΆΠ΅Ρ‚ Ρ€Π°ΡΠΏΡ€ΠΎΡΡ‚Ρ€Π°Π½ΡΡ‚ΡŒ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ шаблонов Π² скомпилированном Π΄Π²ΠΎΠΈΡ‡Π½ΠΎΠΌ Π²ΠΈΠ΄Π΅, находящСмся Π³Π΄Π΅-Ρ‚ΠΎ посСрСдинС ΠΌΠ΅ΠΆΠ΄Ρƒ исходным ΠΊΠΎΠ΄ΠΎΠΌ C++ ΠΈ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΌΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½Ρ‹ΠΌΠΈ Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ.

ВсС Ρ‚Ρ€ΠΈ ΠΏΠΎΡ‚Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Ρ… прСимущСства Ρ€Π°Π·Π΄Π΅Π»ΡŒΠ½ΠΎΠΉ ΠΌΠΎΠ΄Π΅Π»ΠΈ спорны. Π’ΠΎ-ΠΏΠ΅Ρ€Π²Ρ‹Ρ…, хотя Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΠΈ сообщали ΠΎ сокращСнии Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ компиляции, Ρ€Π°Π·Π΄Π΅Π»ΡŒΠ½Π°Ρ модСль Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π² Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… случаях привСсти ΠΊ Π΅Π³ΠΎ ΡƒΠ²Π΅Π»ΠΈΡ‡Π΅Π½ΠΈΡŽ. Π’ настоящСС врСмя Π΄Π°Π½Π½Ρ‹Ρ… для ΠΎΠΊΠΎΠ½Ρ‡Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… Π²Ρ‹Π²ΠΎΠ΄ΠΎΠ² нСдостаточно. Π’ΠΎ-Π²Ρ‚ΠΎΡ€Ρ‹Ρ…, хотя Ρ€Π°Π·Π΄Π΅Π»ΡŒΠ½Π°Ρ модСль сниТаСт Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²ΠΈΠ΄Ρ‹ загрязнСния символов, ΠΏΡ€Π°Π²ΠΈΠ»Π° языка, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Π΅ для ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΈ Ρ€Π°Π·Π΄Π΅Π»ΡŒΠ½ΠΎΠΉ ΠΌΠΎΠ΄Π΅Π»ΠΈ, ΠΈ особСнно идСя двухэтапного поиска, ΡƒΡΠ»ΠΎΠΆΠ½ΡΡŽΡ‚ способ написания ΠΊΠΎΠ΄Π° шаблона β€” Π΄Π°ΠΆΠ΅ ΠΏΠΎ ΡΡ€Π°Π²Π½Π΅Π½ΠΈΡŽ с Π²ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‰Π΅ΠΉ модСлью - ΠΈ ΠΈΠΌΠ΅ΡŽΡ‚ нСсколько Π½Π΅ΠΆΠ΅Π»Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… послСдствий. Π’-Ρ‚Ρ€Π΅Ρ‚ΡŒΠΈΡ…, всС ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Ρ€Π°Π·Π΄Π΅Π»ΡŒΠ½ΠΎΠΉ ΠΌΠΎΠ΄Π΅Π»ΠΈ основаны Π½Π° ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠ΅ EDG, a EDG ΠΏΠΎΠΊΠ° Π΅Ρ‰Π΅ Π½Π΅ прСдоставляСт Π½ΠΈΠΊΠ°ΠΊΠΈΡ… возмоТностСй для компиляции исходных Ρ„Π°ΠΉΠ»ΠΎΠ², содСрТащих Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ экспортируСмых шаблонов, Π² Π΄Π²ΠΎΠΈΡ‡Π½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΠΎΡΡ‚Π°Π²Π»ΡΡ‚ΡŒΡΡ вмСсто исходников.

Π’ 2003 Π³ΠΎΠ΄Ρƒ ΠΈΠΌΠ΅Π»Π° мСсто ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ° ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ экспортируСмыС ΡˆΠ°Π±Π»ΠΎΠ½Ρ‹ ΠΈΠ· Π±ΡƒΠ΄ΡƒΡ‰ΠΈΡ… вСрсий стандарта Π‘++, Π½ΠΎ ΠΎΠ½Π° ΠΏΡ€ΠΎΠ²Π°Π»ΠΈΠ»Π°ΡΡŒ. Π‘Π»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, экспортируСмыС ΡˆΠ°Π±Π»ΠΎΠ½Ρ‹ ΡΠ²Π»ΡΡŽΡ‚ΡΡ постоянной Ρ‡Π°ΡΡ‚ΡŒΡŽ языка Π‘++, ΠΈ Π²Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π½Π°ΡƒΡ‡ΠΈΡ‚ΡŒΡΡ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΡ….

Π‘ΠΌΠΎΡ‚Ρ€ΠΈ Ρ‚Π°ΠΊΠΆΠ΅

Π Π΅Ρ†Π΅ΠΏΡ‚ 1.25.

Π“Π»Π°Π²Π° 2

ΠžΡ€Π³Π°Π½ΠΈΠ·Π°Ρ†ΠΈΡ ΠΊΠΎΠ΄Π°

2.0. Π’Π²Π΅Π΄Π΅Π½ΠΈΠ΅

Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Ρ‡Ρ‚ΠΎ ΠΎΠ΄Π½ΠΎΠΉ ΠΈΠ· ΠΏΡ€ΠΈΡ‡ΠΈΠ½ популярности C++ являСтся Π΅Π³ΠΎ ΡΠΏΠΎΡΠΎΠ±Π½ΠΎΡΡ‚ΡŒ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΠΎ Ρ…ΠΎΡ€ΠΎΡˆΠΎ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒ для ΠΌΠ°Π»Π΅Π½ΡŒΠΊΠΈΡ…, срСдних ΠΈ Π±ΠΎΠ»ΡŒΡˆΠΈΡ… ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠ². Для нСбольшого ΠΏΡ€ΠΎΡ‚ΠΎΡ‚ΠΈΠΏΠ° ΠΈΠ»ΠΈ ΠΈΡΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ всСго нСсколько классов, Π° ΠΏΡ€ΠΈ ростС ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° ΠΈ ΡƒΠ²Π΅Π»ΠΈΡ‡Π΅Π½ΠΈΠΈ числа сотрудников C++ позволяСт ΠΌΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, Ρ€Π°Π·Π±ΠΈΠ² Π΅Π³ΠΎ Π½Π° ΠΌΠΎΠ΄ΡƒΠ»ΠΈ, Ρ€Π°Π·Π»ΠΈΡ‡Π°ΡŽΡ‰ΠΈΠ΅ΡΡ ΠΏΠΎ стСпСни своСй нСзависимости. НСдостатком здСсь являСтся Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Π²Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΏΠΎΡ‚Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ врСмя Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ Ρ€Π΅ΠΎΡ€Π³Π°Π½ΠΈΠ·Π°Ρ†ΠΈΡŽ (Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ пространства ΠΈΠΌΠ΅Π½, Ρ€Π΅ΠΎΡ€Π³Π°Π½ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ физичСскоС располоТСниС Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΈ Ρ‚.Π΄.). ΠžΠ±Ρ‹Ρ‡Π½ΠΎ это стоит Ρ‚ΠΎΠ³ΠΎ, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΏΡ€ΠΈ этом ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ становится ΠΌΠΎΠ΄ΡƒΠ»ΡŒΠ½Ρ‹ΠΌ ΠΈ позволяСт ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΌ людям ΡΠΎΡΡ€Π΅Π΄ΠΎΡ‚ΠΎΡ‡ΠΈΡ‚ΡŒΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½Π° ΠΈΡ… локальной Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠΉ области.