пятница, 30 сентября 2011 г.

Template instantiation library

На конференции по математике речь зашла о програмировании. Один из участников спросил не знаю ли я как сделать "библиотеку из шаблонов", так как он использует свой шаблон только с определенным количеством типов.
Я написала ему вот такой вариант:

a.h:

#pragma once
#include <iostream>
#include <algorithm>
template <class T>
class A
{
    int size;
    T* a;

public:
    A(int s): size(s), a(new T[s]) { std::cerr << "A::A(int s)\n";} ;
    ~A() { std::cerr << "A::~A()\n"; delete [] a; }
    A(const A& source):  
      size(source.size), a(new T[source.size])  
    { 
        std::cerr << "A::A(const T&)\n" ;  
        std::copy(source.a, source.a + source.size, a);  
    } 
    bool compare(const T* with, int s) {
        std::cerr << "A::compare(const T&)";
        if (size == s)
             return std::equal(a, a + size, with);
        return false;
    }
};
 
instantiation.cpp:
#include "a.h"

template class A<int>;
main.cpp
#include <iostream>
#include "a.h"
using namespace std ; 
extern template class A;
int main()
{
        typedef A<int> IntA ;


        IntA ia(5) ;
        IntA ia1 = ia;
        int* a = new int[5];
        ia.compare(a, 5); 
        delete [] a;
}
Компиляция:
$ g++ -fno-implicit-templates -c main.cpp
$ g++  fno-implicit-template -c instantiation.cpp
$ g++ main.o  instantiation.o

Я мало сталкивалась с шаблонами, поэтому с радостью услышу критику такого подхода.