gpt4 book ai didi

c++ - 如何正确关机?

转载 作者:行者123 更新时间:2023-11-28 00:48:36 25 4
gpt4 key购买 nike

这可能是 C++ 编码标准中解释的关闭规则的情况,我想知道我是否做对了。我想知道,因为我在切换函数中仍然有 if 子句。

Class A 永远不会直接实例化,它总是动态创建并通过(共享)指针统一处理的 BCAfoo 根据操作是 B 还是 C 来切换和选择操作。

class A {
public:
virtual ~A(){}
};

class B : public A {};
class C : public A {};

typedef std::shared_ptr<A> Aptr;
typedef std::shared_ptr<B> Bptr;
typedef std::shared_ptr<C> Cptr;


template<class T>
std::shared_ptr<T> get(const Aptr& pA) {
return std::dynamic_pointer_cast< T >( pA );
}

void foo( const Bptr& pB ) {
std::cout << "operate on B\n";
}

void foo( const Cptr& pC ) {
std::cout << "operate on C\n";
}

void foo( const Aptr& pA ) {
if ( auto x = get<B>(pA) ) {
foo(x);
return;
}
if ( auto x = get<C>(pA) ) {
foo(x);
return;
}
assert(!"oops");
}


int main()
{
Aptr pA( new C );

foo( pA );
}

我的问题是 void foo( const Aptr& pA ) 是否可以更优雅地实现。这可能意味着没有 if。在这种情况下是否推荐使用 get 并捕获 foo

最佳答案

除非你有充分的理由不这样做(如果你有理由,你的代码不会显示它们),在我看来这就像通过虚函数实现动态多态性的典型用例:

class A 
{
public:
virtual ~A() {}
virtual void foo() = 0;
};

class B : public A
{
virtual void foo()
{
std::cout << "operate on B\n";
}
};

class C : public A
{
virtual void foo()
{
std::cout << "operate on B\n";
}
};

此外,在 C++11 中,最好使用 std::make_shared<>()在 build 一个shared_ptr裸体new分配(同样,除非你有充分的理由不这样做):

int main()
{
Aptr pA = std::make_shared<C>();
pA->foo();
}

如果您有理由不使用虚函数并且更喜欢一种不同的、非侵入式的多态性,您可以将 Boost.Variant 与 boost::static_visitor 结合使用.这甚至不需要 BC相关。

#include <boost/variant.hpp>
#include <memory>
#include <iostream>

class B /* ... */ {};
class C /* ... */ {};

// ...
typedef std::shared_ptr<B> Bptr;
typedef std::shared_ptr<C> Cptr;

struct foo_visitor : boost::static_visitor<void>
{
void operator () (Bptr p)
{
std::cout << "operate on B\n";
}

void operator () (Cptr p)
{
std::cout << "operate on C\n";
}
};

int main()
{
boost::variant<Bptr, Cptr> ptr;
ptr = std::make_shared<C>();

foo_visitor v;
ptr.apply_visitor(v);
}

这种方法与您选择的方法非常相似,除了 Boost.Variant 还确保您不会忘记为变体可能采用的每个值(在本例中为 BptrCptr ).

关于c++ - 如何正确关机?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15179844/

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