gpt4 book ai didi

c++ - 无重复代码的多态函数调用

转载 作者:可可西里 更新时间:2023-11-01 17:56:39 26 4
gpt4 key购买 nike

假设一个层次结构的所有类都实现了一个模板成员函数g。所有类共享调用此模板的另外两个函数 f1f2 的相同实现:

struct A {
virtual void f1() {
g(5);
}
virtual void f2() {
g(5.5);
}
private:
template <typename T> void g(T) {std::cout << "In A" << std::endl;}
};

struct B: A {
// Can I get rid of this duplicate code?
virtual void f1() {
g(5);
}
virtual void f2() {
g(5.5);
}
private:
template <typename T> void g(T) {std::cout << "In B" << std::endl;}
};

struct C: A {
// Can I get rid of this duplicate code?
virtual void f1() {
g(5);
}
virtual void f2() {
g(5.5);
}
private:
template <typename T> void g(T) {std::cout << "In C" << std::endl;}
};

int main()
{
B b;
A &a = b;
a.f1();
return 0;
}

由于 f1f2 的实现在所有类中都是相同的,我怎样才能摆脱重复的代码并仍然在 中进行多态调用main 按预期工作(即产生输出“In B”)?

最佳答案

请注意 f1 的实现和 f2A , B , 和 C 相同。让我们将其限制为 f1秒。调用一个名为 ::A::g<int> 的函数, 另一个调用名为 ::B::g<int> 的函数, 第三个调用名为 ::C::g<int> 的函数.它们完全相同。

你能做的最好的事情就是拥有一个 CRTP -样式基础:

template <class Derived>
struct DelegateToG : public A
{
void f1() override
{
static_cast<Derived*>(this)->g(5);
}

void f2() override
{
static_cast<Derived*>(this)->g(5.5);
}
};

class B : public DelegateToG<B>
{
friend DelegateToG<B>;
private:
template <class T> void g(T) { /*...*/ }
};

class C : public DelegateToG<C>
{
friend DelegateToG<C>;
private:
template <class T> void g(T) { /*...*/ }
};

关于c++ - 无重复代码的多态函数调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36220231/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com