std :: optional和polymorphism

时间:2016-05-22 00:38:14

标签: c++ optional

我在许多帖子中都读过Stack Overflow,当使用指针(用于参数或返回值)并允许||(使其成为可选)时,通常最好使用nullptr代替

但是如果指针指的是多态类型怎么办?最好使用std::optional还是指针?

4 个答案:

答案 0 :(得分:5)

optional不适用于多态类型。它是一种值类型,多态基类不适用于optional。就像在vector或类似容器中放置多态基类一样无效。

返回一个指针。这些建议通常被称为"通常"。

答案 1 :(得分:2)

std::optional proposal明确表示它不是多态的:

  

value_ptr要求指向对象在中分配   免费商店。这意味着sizeof(value_ptr<T>)已修复   不论Tvalue_ptr是多态的&#39;:类型的对象   value_ptr<T>可以指向DT类型的对象,该对象派生自T。   深层复制保留动态类型。可选不需要免费   商店分配:它的创造更有效率;它不是   &#34;多态型&#34;

您的选项归结为原始指针或unique_ptr。如果您需要副本和原始指针,请使用unique_ptr

答案 2 :(得分:2)

您可以编写多态伪可选。

您将希望使用有界对象大小/对齐(可能是参数)实现小对象优化,并包括基类加上一组要删除的附加操作(如复制或移动)。我已经编写了一个有界的多态类型而没有指针回退,如果由于类似的原因缺少空间而无法编译,可能是在SO上发布的。

可选不是多态的,但是常规和伪常规值类型可以。可选的over pointers / smart ptrs的大多数参数实际上是使用常规和伪常规非分配类型的参数。

答案 3 :(得分:1)

  

我已经在很多帖子中读过stackoverflow,当使用指针(对于参数或返回值)并允许nullptr(使其成为可选)时,通常会更好改为使用std::optional

据推测,您指的是使用std::optional来携带除指针或引用之外的值。在这种情况下,您正在谈论可选的参数可选的返回值

optional用于可选的in-argument具有以下缺点:对象被复制或至少移动,这可能是不期望的。此外,它排除了多态性。

最简单的方法是避免不必要的复制,并支持多态,是使用指向const的指针:

void foo( Some_type const* p_object )

但是调用者必须在实际参数上使用&运算符。

为简化调用,您可以提供重载语法含糖

void foo() { foo( nullptr ); }
void foo( Some_type const& object ) { foo( &object ); }

支持

之类的调用
foo();

foo( o );

使用optional作为返回值的优点是,当调用代码正确检查值存在时,可以避免异常抛出。但是它似乎排除了包装对象的普通RVO(返回值优化) - 狡猾的单词“出现”,因为我无法看到这个的密闭证明,但我仍然无法看到RVO可以做到。因此,当没有返回值的情况很少,和/或效率非常重要时,最好只抛出一个异常。 C ++只支持(原始)指针和多态返回值的引用,并且使用optional和抛出异常以指示没有返回值之间在这方面没有区别。

对于多态可选返回值,您可以使用处理所有权的智能指针,如std::unique_ptrstd::shared_ptr

相关问题