这个问题可能已经有了一个很好的答案,但我也想把我的意见加入其中。
C++允许在程序结构的声明和实现之间进行分离。这源于C/C++程序员如何向彼此发布新功能的方式:头文件包含在依赖编译单元中,而不是那些单元依赖于编译中存在的元数据(就像你如果使用C#或Java一样预期)。
每次你给编译器一个指令,无论它是一个声明(“将会有这个具有这个接口的东西”)还是一个实现(“这里是这个具有这个接口和这些行为的东西”),你都有机会将该指令转化为模板。
事实上,你有这个选择的机会,而不是必须这样做,这比像Java和C#这样的更现代的语言给你更多的灵活性。
考虑下面的模板(我有点生疏,请轻微忽略语法问题):
template<typename Junk>
class IGotJunk {
private:
Junk myJunk_;
public:
void SetJunk(Junk const& source);
Junk const& GetJunk() const;
}
您所说的模板的“典型”实现可能包括以下默认行为:
template<typename Junk>
void IGotJunk<Junk>::SetJunk(Junk const& source)
{
myJunk_ = source
}
然而,对于字符串来说,存在一个风险,就是在指针被复制后,字符串可能会被修改。在这种情况下,您可以提供一种专门的行为,以确保复制的是字符串本身,而不是指针(再次强调,这已经是很久很久以前的事情了)...
void IGotJunk<char*>::SetJunk(char* const& source)
{
free(myJunk_);
myJunk_ = malloc(strlen(source) + 1);
strcpy(myJunk_, source);
}
您可以对GetJunk()做类似的操作。这可能是您必须为创建的每个工件声明模板参数的原因:因为您可能不希望它们在每种情况下都相同。