用“模板”编写C或C ++库

(1)。 使用C ++模板时,编译器(例如g ++)不能直接编译模板定义(只能​​在头文件而不是源文件中),而是根据每个实例的模板定义生成代码,然后才是正确的为其实例化编译生成的代码?

(2)。 如果我想编写一个提供模板类和模板函数的C ++库,是不可能将库编译成共享文件(.so,.a),因为它们的实例化不会出现在库的代码中的任何地方,而只会出现在用户的程序? 如果是,是否意味着模板库只是源代码文件而不是预编译文件?

如何实现C ++标准模板库(STL)? 它的源代码是否与用户程序一起预编译或编译?

(3)。 在C中,

如何在C ++中编写一个提供类似模板函数的函数的库? 重载是一个好的解决方案吗?

如果我必须为不同类型的参数将一个过程写入不同的函数,那么重用代码是否有好的方法? 这是一个很好的方法来做到这一点http://www.vlfeat.org/api/imop_8c_source.html ? 还有其他方法吗?

感谢致敬!

使用C ++模板时,编译器(例如g ++)是否会编译模板定义是正确的。

是。 这是一个正确的假设。

模板定义是不完整的代码。 您需要在编译之前填写模板参数。

如果我想编写一个提供模板类和模板函数的C ++库,是不可能将库编译成共享文件(.so,.a)

不,这是不可能的。 您只能编译模板的单个实例。

如何实现C ++标准模板库(STL)? 它的源代码是否与用户程序一起预编译或编译?

STL代码的很大一部分驻留在头文件中,并与您的应用程序一起编译。

在C中,如何在C ++中编写一个提供类似模板函数的函数的库? 这是一个很好的方法来做到这一点http://www.vlfeat.org/api/imop_8c_source.html ? 还有其他方法吗?

在重新定义宏之后多次包含相同的文件(如您提供的链接中所示)是一种很好的方法。

(3)。 在C中,如何在C ++中编写一个提供类似模板函数的函数的库? 重载是一个好的解决方案吗?

如果我必须为不同类型的参数将一个过程写入不同的函数,那么重用代码是否有好的方法? 这是一个很好的方法来做到这一点http://www.vlfeat.org/api/imop_8c_source.html ? 还有其他方法吗?

当我需要编写通用代码时,我使用void *作为基本数据类型。 这很好,因为它允许您存储通用指针和“原始”值(如int)。 最近我不得不在64位环境中使用这种模式编译一些代码,这告诉我stdint.h数据类型的重要性!

说到C中的模板,这不是一个好主意。 当然,这只是我的观点,但我认为C的优点在于它的简单性,这就是为什么C比C ++更不易出错的原因。