typedef和明确的实例之间的重复代码(Code duplication between type

2019-06-26 04:42发布

tree.h中

template<typename Functor, char Operator>
class binary_operation : public node
{
// ... unimportant details ...

    unsigned evaluate() const;
    void print(std::ostream& os) const;
};

typedef binary_operation<std::plus<unsigned>, '+'> addition;
typedef binary_operation<std::multiplies<unsigned>, '*'> multiplication;
// ...

tree.cpp

template<typename Functor, char Operator>
unsigned binary_operation<Functor, Operator>::evaluate() const
{
    // ... unimportant details ...
}

template<typename Functor, char Operator>
void binary_operation<Functor, Operator>::print(std::ostream& os) const
{
    // ... unimportant details ...
}

template class binary_operation<std::plus<unsigned>, '+'>;
template class binary_operation<std::multiplies<unsigned>, '*'>;
// ...

正如你所看到的,有在头文件中的typedef和实现文件中明确的类模板实例之间的一些代码重复。 是否有某种方式来摆脱不需要把“一切”在头文件中像往常一样重复的?

Answer 1:

因为一个typedef名称在详尽类型说明符所用,这是无效的,并通过实施方式拒绝

template class addition;

以下是无效的也是如此,因为标准说必须有包含在精细的类型说明一个简单的模板ID。 科莫在线和GCC都接受它,虽然。

template class addition::binary_operation;

你可以申请一个变态的解决办法,虽然是完全符合标准

template<typename T> using alias = T;
template class alias<multiplication>::binary_operation;

至少我找不到它正在对快速浏览整个规格不再无效。



Answer 2:

使用宏。 你可以写像头

I_HATE_MACROS(binary_operation<std::plus<unsigned>, '+'>, addition)
I_HATE_MACROS(binary_operation<std::multiplies<unsigned>, '*'>, multiplication)

然后,你可以做

#define I_HATE_MACROS(a, b) typedef a b;

要么

#define I_HATE_MACROS(a, b) template class a;

然后

#include "DisgustingMacroHackery.h"


Answer 3:

我问我自己,为什么你实际编写一个.cpp文件,你有模板,他们应该去要么全部在头文件中或在seprarate文件,例如“.icc”,它拥有从cpp文件的东西。 我不知道,但tempalates定义应始终无法在编译单元。

见- > 在一个.cpp文件中存储C ++模板函数定义



文章来源: Code duplication between typedefs and explicit instantiations