免责声明:我无法判断您是否真的需要模板来完成您的工作。这取决于您希望 Adddition 类模板使用的不同类型的数量。如果您只将它用于int
,那么这可能会引入不必要的复杂性。您总是可以稍后重构(这将是敏捷方法)。
话虽如此,如果要使用模板,通常的约定是T
为模板参数编写,并为类模板type
中的嵌套使用。typedef
使用typename
orclass
是个人喜好问题,但typename
强调内置类型也可以作为参数传递。但是请注意,使用模板模板参数,您需要编写
template<template<typename> class U> SomeClass { /* your definition */ };
^^^^^ // <-- NOT typename here
这强调了只有类模板可以作为参数传递的事实。
还有一些其他的挑剔可能会提到您的代码会导致编译失败(convert()
在类定义中缺少返回类型和缺少分号):
template <typename T>
class Addition
{
static const std::size_t N = 256; // are you sure that 256 is all you'll ever need?
T num_a;
T num_b;
void convert(T const*, T const*); // by T const*, not T*
public:
Addition(T const&, T const&); // by T const&, not T
}; // <-- make sure to end class definitions with a semi-colon!
template <typename T>
Addition::Addition(T const& a, T const& b)
{
convert(&a, &b);
num_a = a;
num_b = b;
}
template <typename T>
void Addition::convert(T const* a, T const* b) // <-- use T const* if you don't modify the parameters
^^^^ // <-- you forgot the return type
{
int temp_a = a, temp_b = b;
a = char[N], b = char[N]; <-- hardcoded 256 is bad practice, better to keep that in 1 place only
// converting
}
在 C++11 中,您甚至可以使用委托构造函数(由最新的 Visual C++ 和当然 gcc/Clang 支持)并编写
template <typename T>
Addition::Addition(T const& a, T const& b)
:
Addition(&a, &b) // delegate to the other constructor
{}
template <typename T>
Addition::Addition(T const* a, T const* b) // <-- use T const* if you don't modify the parameters
{
int temp_a = a, temp_b = b;
a = char[N], b = char[N]; <-- hardcoded 256 is bad practice, better to keep that in 1 place only
// converting
}
最后,因为模板定义无论如何都必须在标题中,你甚至可以像这样在类定义中编写所有内容:
template <typename T>
class Addition
{
static const std::size_t N = 256; // are you sure that 256 is all you'll ever need?
T num_a;
T num_b;
Addition(T const*, T const*) // by T const*, not T*
{
int temp_a = a, temp_b = b;
a = char[N], b = char[N];
// converting
}
public:
Addition(T const&, T const&) // by T const&, not T
:
Addition(&a, &b) // delegate to the other constructor
{}
}; // <-- make sure to end class definitions with a semi-colon!
这使您不必繁琐地编写所有成员函数的声明和定义。对于短而甜的类(无论如何你都应该努力),这是编写模板的首选方式,但对于非常长的定义,你可能希望将声明和定义分开。
最后,正如@tacp 所解释的,您确实需要使用this->a
来消除类数据成员与函数参数的歧义。出于这个原因,人们经常使用尾随下划线或m_
前缀编写数据成员。