SORU
15 Kasım 2011, Salı


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
15 Kasım 2011, Salı


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.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Bokeh

    Bokeh

    9 HAZİRAN 2014
  • Diogo Oliveira

    Diogo Olivei

    4 HAZİRAN 2006
  • Kindness

    Kindness

    23 Ocak 2006