gpt4 book ai didi

c++ - 禁用 std::optional 的转发构造函数

转载 作者:行者123 更新时间:2023-11-30 03:16:30 25 4
gpt4 key购买 nike

我用模板转换运算符扩展了 QDataStream,以便数据流从自身加载并转换为任何支持的类型,如下所示:

class ConvertibleQDataStream : public QDataStream
{
public:

using QDataStream::QDataStream;

template <class T>
explicit operator T ()
{
T t;
*this >> t;
return t;
}
};

并且可以通过重载运算符 >> 添加对 QDataStream 不支持的类型的支持,例如:

template <class T>
ConvertibleQDataStream&
operator >> (ConvertibleQDataStream& ds, std::vector<T>& v)
{
//Called for std::vector's.
return ds;
}

我们的想法是能够直接从流中构造非默认可构造类,如下所示:

class Bar
{
public:

Bar(ConvertibleQDataStream&);
};

class Foo
{
int mInt;
std::vector<double> mVector;
Bar mBar;

public:

Foo(ConvertibleQDataStream& ds) :
mInt(ds), //Calls operator >> for int and converts to int
mVector(ds), //Calls operator >> for std::vector<T> and converts to std::vector<T>
mBar(ds) //Plain constructor call
{}
};

这很好用,除非成员是 std::optionalstd::optional 的转发构造函数被调用,而不是 ConvertibleQDataStream 的模板转换运算符:

template <class T>
ConvertibleQDataStream&
operator >> (ConvertibleQDataStream& ds, std::optional<T>& o)
{
//Never called :(
return ds;
}

class Qux
{
std::optional<Bar> mOptional;

public:

Foo(ConvertibleQDataStream& ds) :
mOptional(ds) //calls Bar::Bar(ConvertibleQDataStream&) rather then operator >> for std::optional<T> due to forwarding c'tor.
{}
};

是否可以禁用 std::optional 的转发构造函数?或者另一种解决方法。

最佳答案

这不是选项的问题,这是您设计中的问题,其中 mOptional 可从 ConvertibleQDataStream 构造。

C++ 转换规则可能是一场噩梦,在这种情况下应该通过提供明确的 get 运算符来避免。

class ConvertibleQDataStream : public QDataStream
{
public:
using QDataStream::QDataStream;

template <class T>
T Get() const
{
T t;
*this >> t;
return t;
}
};

class Qux
{
std::optional<Bar> mOptional;

public:

Foo(ConvertibleQDataStream& ds) :
mOptional(ds.Get<std::optional<Bar>>())
{}
};

关于c++ - 禁用 std::optional 的转发构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56298703/

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