如何在静态库的头文件中隐藏模板定义

时间:2019-02-07 18:59:46

标签: c++ static-libraries

我正在构建一个静态库,其中通过模板使用泛型。这是该库的样本模板头文件,用于计算平均值

#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;
}

我知道我们不能将模板的声明和定义分成单独的文件(两者都必须在头文件中),但这将我的库代码实现暴露给第三方用户,因为该用户需要库头文件。因此,我想知道是否可以创建一个包含模板定义的库,而无需将其实现部分暴露给第三方用户。

0 个答案:

没有答案