как скрыть определение шаблона в заголовочных файлах статической библиотеки - PullRequest
0 голосов
/ 07 февраля 2019

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

#ifndef AVERAGE_H_
#define AVERAGE_H_

#include<iostream>
#include<vector>
#include<numeric>

template<typename T>
class Average
{
public:
    std::vector<T> data;
    T getAvg();
};

template<typename T>
T Average<T>::getAvg()
{
    T sum=std::accumulate(data.begin(),data.end(),(T)0.0);

    return (T)(sum/data.size());
}

#endif /* AVERAGE_H_ */

И это пример кода приложения, в котором используется вышеуказанный код библиотеки

#include "Average.h"

int main(int argc,char* argv[])
{
    Average<int> *objAvgInt = new Average<int> { };
    objAvgInt->data.push_back(1);
    objAvgInt->data.push_back(2);
    objAvgInt->data.push_back(3);
    objAvgInt->data.push_back(4);
    objAvgInt->data.push_back(5);
    objAvgInt->data.push_back(6);

    int avgInt=objAvgInt->getAvg();
    std::cout << "Int Avg= " << avgInt << std::endl;

    Average<float> *objAvgFloat = new Average<float> { };
    objAvgFloat->data.push_back(1);
    objAvgFloat->data.push_back(2);
    objAvgFloat->data.push_back(3);
    objAvgFloat->data.push_back(4);
    objAvgFloat->data.push_back(5);
    objAvgFloat->data.push_back(6);

    float avgFloat=objAvgFloat->getAvg();
    std::cout << "Float Avg= " << avgFloat << std::endl;
}

Я знаючто мы не можем разделить объявление и определение шаблона в отдельных файлах (оба должны быть в заголовочном файле), но это предоставляет мою реализацию кода библиотеки стороннему пользователю, так как пользователю нужны файлы заголовков библиотеки.Поэтому я хочу знать, возможно ли создать библиотеку, содержащую определения шаблонов, без предоставления ее части реализации стороннему пользователю.

...