防止代码重复:两个长函数仅在内部循环中不同
Code duplication prevention : 2 long functions differing only in inner loop
我有两个函数,f_a和f_b遵循一个通用形式
void f_x(){
for (int i = 0; i < 10; ++ i){
for (int j = 0; j < 10; ++ j){
//do loads of generic stuff
//do stuff specific to x
}
}
};
我不想(1)多次编写for循环,也不想(2)在内部循环中有一个条件来检查是否执行a或b细节。一种解决方案是使用如下模板,
template <int I>
inline void specific(){}
template <>
inline void specific<0> { // do a-specific tasks }
template <>
inline void specific<1> { // do b-specific tasks }
template <int I>
void f(){
for (int i = 0; i < 10; ++ i){
for (int j = 0; j < 10; ++j){
//do loads of generic stuff
specific<I>();
}
}
}
inline void f_a(){
f<0>();
}
inline void f_b(){
f<1>();
}
我的问题是:
这似乎是一个公平的解决方案吗?
出于兴趣,是否存在不使用模板的解决方案?
与其将specific
函数作为模板,不如将它们作为普通函数,然后传递给通用f
函数。
类似的东西
template<typename F>
void f(F func){
for (int i = 0; i < 10; ++ i){
for (int j = 0; j < 10; ++j){
// Generic stuff...
// Call the specific function
func();
}
}
}
void specific_x() { ... }
void specific_y() { ... }
void f_x(){
f(specific_x);
}
void f_y(){
f(specific_y);
}
与您的解决方案类似,但更通用的是,您现在可以将任何可调用对象传递到函数f
,包括函数指针(在上面的示例中使用)、函数、lambdas和其他所有可以调用的对象。
相关文章:
- 如何确保C++函数在定义之前声明(如override关键字)
- libssh 的函数在构建 libssh 时无法在 Qt 和 cmake 错误中找到
- CHECK(调用)函数在Google Colab中出错
- 构造函数在退出函数时无法初始化一个参数
- 使用.find函数在c++中查找字符和另一个字符之间的大小
- 函数在Windows或Linux上运行时表现不同
- STL算法函数在多个一维容器上的使用
- 特征运算符如何在内部解释为 MKL 函数?
- 当在函数内部使用静态变量时,输出会发生变化,该函数在c++中返回引用
- 我可以在内部函数中禁用宏吗?
- friend函数是如何在内部实现的
- 防止代码重复:两个长函数仅在内部循环中不同
- 在C++中的函数调用内部执行强制转换时,强制转换是否真的有效
- C++ - 在内部,在定义类的成员函数时,应该使用成员变量名还是其getter函数?
- 在内部结构的定义中使用保存函数的类成员变量,这些内部结构将用作unordered_map对象的模板参数
- 如何编写c++模板函数在内部调用多个C函数
- 派生类构造函数如何在内部调用基类构造函数
- 使用内部函数在数组中查找下一个非零
- 函数/方法如何在内部返回对对象的引用
- 使用静态constexpr成员函数在类内部返回auto