kullanarak dış şablonu (C 0)
Şekil 1:işlev şablonları
TemplHeader.h
template<typename T>
void f();
TemplCpp.cpp
template<typename T>
void f(){
//...
}
//explicit instantation
template void f<T>();
Main.cpp
#include "TemplHeader.h"
extern template void f<T>(); //is this correct?
int main() {
f<char>();
return 0;
}
Bu extern template
, kullanmak için doğru yolu veya Şekil 2'de sınıf şablonları için bu kelime kullanılır?
Şekil 2:sınıf şablonları
TemplHeader.h
template<typename T>
class foo {
T f();
};
TemplCpp.cpp
template<typename T>
void foo<T>::f() {
//...
}
//explicit instantation
template class foo<int>;
Main.cpp
#include "TemplHeader.h"
extern template class foo<int>();
int main() {
foo<int> test;
return 0;
}
Biliyorum iyi koymak tüm bu bir başlık dosyası, ama eğer biz oluşturmak şablonları ile aynı parametreleri içinde birden fazla dosya var, o zaman birden fazla aynı tanımlar ve derleyici olacak kaldırın hepsini, biri hariç) hataları önlemek. Nasıl extern template
kullanabilirim? Sadece sınıflar için kullanabilir miyiz, ya da işlevler için de kullanabilir miyiz?
Ayrıca, Şekil 2 ve Şekil 1 şablonları tek bir başlık dosyası içinde olduğu bir çözüm için genişletilmiş olabilir . Bu durumda, birden fazla aynı instantations önlemek için extern template
anahtar kelime kullanmamız gerekiyor. Sadece sınıfları veya fonksiyonları için bu çok mu?
CEVAP
Sadece dış iskelet derleyici zorlamak için kullanmalısınızdeğilkullanılan bir şablonbiliyorsunbaşka bir yerde örneği olacak, zamanı azaltmak derleme ve nesne dosya boyutunu azaltmak için kullanılır.
Örneğin:
// header.h
template<typename T>
void ReallyBigFunction()
{
// Body
}
// source1.cpp
#include "header.h"
void something1()
{
ReallyBigFunction<int>();
}
// source2.cpp
#include "header.h"
void something2()
{
ReallyBigFunction<int>();
}
Bu aşağıdaki nesne dosyalarını neden olur:
source1.o
void something1()
void ReallyBigFunction<int>() // Compiled first time
source2.o
void something2()
void ReallyBigFunction<int>() // Compiled second time
Eğer her iki dosya birlikte bağlıysa void ReallyBigFunction<int>()
, zaman ve nesne boyut derleme atık sonuçlanan atılacak.
Derleme atık zaman ve boyut bir nesne için derleyici şablon işlevi derleme değil yapar dışarıdan bir sözcük vardır. bu kullanmalısınızeğer biliyorsan Eğer ve sadeceaynı ikili yılında kullanılan başka bir yerde.
Değişen source2.cpp
// source2.cpp
#include "header.h"
extern template ReallyBigFunction<int>();
void something2()
{
ReallyBigFunction<int>();
}
Aşağıdaki nesne neden olur dosyaları:
source1.o
void something1()
void ReallyBigFunction<int>() // compiled just one time
source2.o
void something2()
// No ReallyBigFunction<int> here because of the extern
Bunların her ikisi de birbirine bağlı olacak, ikinci nesne dosyası sadece ilk nesne dosyasından sembol kullanır. Atıp hiç gerek derleme zamanı ve boyut nesne boşa.
Bu sadece bir proje içinde kullanılmalıdır, vector<int>
gibi bir şablon kullandığınızda zamanlarda birden çok kez, ama bir kaynak dosyası dış kullanmalısınız.
Bu aynı zamanda sınıflar için geçerlidir ve bir ve şablon üye işlev bile işlevi görür.
Üye işlevi olan bir tür için bir kavra...
Nakavt veri bağlama kullanarak görüntü...
Rol yeni bir MVC 4 Internet şablonu si...
kullanarak dış şablonu (C 0)...
'in kim olduğunu, nasıl Krom kull...