【发布时间】:2021-09-22 13:20:09
【问题描述】:
这不是主要的代码破坏问题,我只是想知道我是否错过了一些巧妙的技巧。
如果我正在编写一个模板类,我可能会这样开始:
// some_header.h
template <typename TypeParameter, size_t max_array_size>
class TemplatedClass
{
std::array<TypeParameter, max_array_size> MyTemplatedArray;
public:
TypeParameter do_something()
{
/* do something with TypeParameter and max_array_sizein here */
}
}
这很好,但是当我有不那么琐碎的模板化示例时,我倾向于将函数定义与声明分开,如下所示:
// some_header.h
template <typename TypeParameter, size_t max_array_size>
class TemplatedClass
{
std::array<TypeParameter, max_array_size> MyTemplatedArray;
public:
TypeParameter do_something();
/*
Many more function declarations
*/
}
template <typename TypeParameter, size_t max_array_size>
TemplatedClass<TypeParameter, max_array_size>::do_something()
{
/* do something with TypeParameter and max_array_sizein here */
}
/*
Many more function definitions, all with:
template <typename TypeParameter, size_t max_array_size>
TemplatedClass<TypeParameter, max_array_size>
at the start
*/
这样做的目的是拥有一个经典的骨架类定义,其他人一眼就能轻松阅读。我不介意这样做,但令人讨厌的是当我想修改模板参数时。第一个示例中的一个变化是什么,最终成为第二个示例中的1 + 2 * n 变化!
所以我想知道的是:有没有办法让第二个示例的模板参数更易于维护?可能是类似于 typedef/using 的东西,或者是我没听说过的关键字?
【问题讨论】:
-
只要去掉声明和实现的分离。请注意,由于 C++ 继承了 C 的标头,因此需要此拆分,因此必须将代码放在 ccp 文件中并在头文件中声明。使用模板,一切都在头文件中(通常),没有必要分开。此外,C++20 终于引入了模块,这些模块将不再需要头文件,因此不再需要单独的声明和定义。
-
如果
/*do soemthing*/不依赖于模板参数,您应该将这些方法移至非模板基类。如果/*do something*/确实依赖于模板参数,那么无论如何您需要进行 2 次以上的更改。我认为您的问题没有很好的答案,但实际上这不是问题(也因为当重要时您仍然可以直接在类中定义方法) -
感谢@MarekR。我知道我可以坚持使用示例 1,但我认为示例 2 是一种相当普遍的做法,可以使事情更具可读性。也许并没有我想象的那么普遍。
-
我只是说引入这种做法是为了解决一些无法解决的问题。现在它已经深深印在我们的脑海中(我的也是),有时在不需要时很难摆脱。
-
你可以使用预处理器定义...