由于 if 语句 c++11 而避免重复代码的不便
Incovenience of avoiding duplicate code due to an if statement c++11
我想避免这个用例中的重复代码
class A {
protected:
virtual void A1(const void* const s, const std::streamsize n) const;
inline void A2(const void* const s, const std::streamsize n) const;
};
class B : public A {
private:
const char *a;
void B1(const char *b) {
if (!b) {
return;
}
if (a < b) {
A1(a, b-a);
}
}
void B2(const char *b) {
if (!b) {
return;
}
if (a < b) {
A2(a, b-a);
};
}
};
因此,正如您在上面看到的 B1()
和 B2()
中一样,存在重复代码(检查 b
),除了 if 中的调用(请注意如果条件相同)。我认为这 if
在某种程度上不方便提取新方法,但我也认为可以使用 lambdas and/or 模板来完成。对于这个用例如何实现 A1()
和 A2()
没有兴趣。
我的问题:避免代码重复的最好和最简单的方法是什么?
您可以编写一个接受指向要执行的成员的指针的函数
class B : public A {
private:
const char *a;
using F = void(A::*)(const void* const, const std::streamsize) const;
void RunFun(F f, const char *b) {
if (!b) {
return;
}
if (a < b) {
(this->*f)(a, b-a);
}
}
void B1(const char *b) {
RunFun(&B::A1,b);
}
void B2(const char *b) {
RunFun(&B::A2,b);
}
};
另一个(简化的)示例,使用 lambda 和 std::function
#include <cstring>
#include <iostream>
#include <functional>
struct A
{
virtual void A1 (char const * const b)
{ std::cout << b << "\n- A1 call" << std::endl; }
void A2 (char const * const b)
{ std::cout << b << "\n- A2 call" << std::endl; }
};
struct B : public A
{
const char * a;
std::function<void(char const * const, void(A::*)(char const * const))>
funcA { [this](char const * const b, void(A::*f)(char const * const))
{ if ( b && std::strlen(b) ) (this->*f)(b); } };
void B1 (char const * b)
{ funcA(b, &A::A1); }
void B2 (char const * b)
{ funcA(b, &A::A2); }
};
int main ()
{
B b;
b.B1("- B1 call");
b.B2("- B2 call");
}
我想避免这个用例中的重复代码
class A {
protected:
virtual void A1(const void* const s, const std::streamsize n) const;
inline void A2(const void* const s, const std::streamsize n) const;
};
class B : public A {
private:
const char *a;
void B1(const char *b) {
if (!b) {
return;
}
if (a < b) {
A1(a, b-a);
}
}
void B2(const char *b) {
if (!b) {
return;
}
if (a < b) {
A2(a, b-a);
};
}
};
因此,正如您在上面看到的 B1()
和 B2()
中一样,存在重复代码(检查 b
),除了 if 中的调用(请注意如果条件相同)。我认为这 if
在某种程度上不方便提取新方法,但我也认为可以使用 lambdas and/or 模板来完成。对于这个用例如何实现 A1()
和 A2()
没有兴趣。
我的问题:避免代码重复的最好和最简单的方法是什么?
您可以编写一个接受指向要执行的成员的指针的函数
class B : public A {
private:
const char *a;
using F = void(A::*)(const void* const, const std::streamsize) const;
void RunFun(F f, const char *b) {
if (!b) {
return;
}
if (a < b) {
(this->*f)(a, b-a);
}
}
void B1(const char *b) {
RunFun(&B::A1,b);
}
void B2(const char *b) {
RunFun(&B::A2,b);
}
};
另一个(简化的)示例,使用 lambda 和 std::function
#include <cstring>
#include <iostream>
#include <functional>
struct A
{
virtual void A1 (char const * const b)
{ std::cout << b << "\n- A1 call" << std::endl; }
void A2 (char const * const b)
{ std::cout << b << "\n- A2 call" << std::endl; }
};
struct B : public A
{
const char * a;
std::function<void(char const * const, void(A::*)(char const * const))>
funcA { [this](char const * const b, void(A::*f)(char const * const))
{ if ( b && std::strlen(b) ) (this->*f)(b); } };
void B1 (char const * b)
{ funcA(b, &A::A1); }
void B2 (char const * b)
{ funcA(b, &A::A2); }
};
int main ()
{
B b;
b.B1("- B1 call");
b.B2("- B2 call");
}