如何避免在库中为许多类型/函数重复键入模板特化

时间:2014-07-24 00:46:14

标签: c++ templates c-preprocessor

我在库cpp文件中有各种模板化函数,看起来像这样:

template <class TT> TT im::BlockMultiplyAdd(const MtxView<TT> &src1, const MtxView<TT> &src2)
{
...
}

并在cpp文件中也有实例化,如下所示:

template float im::BlockMultiplyAdd(const MtxView<float> &src1, const MtxView<float> &src2);
template double im::BlockMultiplyAdd(const MtxView<double> &src1, const MtxView<double> &src2);
template std::complex<float> im::BlockMultiplyAdd(const MtxView<std::complex<float>> &src1, const MtxView<std::complex<float>> &src2);
template std::complex<double> im::BlockMultiplyAdd(const MtxView<std::complex<double>> &src1, const MtxView<std::complex<double>> &src2);

我还在头文件中有声明。

现在我有很多这样的函数,我厌倦了为同一组四种类型反复输入相同的特化/声明。并非所有函数都具有相同的参数,但它们都具有为其构建的四种类型的相同集合。

有没有办法可以制作预处理器宏或使用模板语法或更有效地安排我的代码,这样我就可以减少输入(并减少错误)?

我应该将所有代码放在模板的头文件中吗?静态库的优缺点是什么?

2 个答案:

答案 0 :(得分:1)

将它放入标题可能更容易,而不是依赖于显式实例化。但是如果你想这样做,你可以做类似

的事情
// helper.h

// no include guard - important!
template TYPE im::BlockMultiplyAdd(const MtxView<TYPE> &src1, const MtxView<TYPE> &src2);
// similar stuff follows

然后在您的cpp文件中,多次包含它,每次TYPE定义不同:

// instantiations.cpp

// template definition....

#define TYPE float
#include "helper.h"

#undef TYPE
#define TYPE double
#include "helper.h"

#undef TYPE
#define TYPE std::complex<float>
#include "helper.h"

#undef TYPE
#define TYPE std::complex<double>
#include "helper.h"
//etc...

答案 1 :(得分:0)

我最终这样做的方法就是为每个事件创建一个临时宏,如下所示:

template <class TT> void im::BlockMultiply(MtxView<TT> dst, const MtxView<TT> &src1, const MtxView<TT> &src2)
{
...
}

#define INST(TT) template void im::BlockMultiply(MtxView<TT> dst, const MtxView<TT> &src1, const MtxView<TT> &src2)
INST(float); INST(double); INST(std::complex<float>); INST(std::complex<double>);
#undef INST

剪切和粘贴并不是很难,因为除了<class TT>之后删除template之外没有任何需要改变。