gpt4 book ai didi

c++ - 将包装器对象用作具有可变模板和引用参数的 RValue

转载 作者:行者123 更新时间:2023-11-28 04:58:37 28 4
gpt4 key购买 nike

我有一个可变模板函数

template<typename ...ARGS>
inline void ReadStream::decode(ARGS&...args) {
internalDecode(args...);
}

template<typename T, typename ...ARGS>
inline void ReadStream::internalDecode(T &head, ARGS&...args) {
read(head);
internalDecode(args...);
}

inline void ReadStream::internalDecode() {
}

这让我可以写

int a, b;
ByteArray c;
String d

x.decode(a,b,c,d);

将传入的二进制流解压缩为一组没有样板的变量。

我已经实现了一个包装器对象“FixedSize”,它更改了读取/解码特定变量的默认格式。

 template <typename T>
class FixedSize{
T &value;
uint16_t length;

public:

FixedSize(T &wrapped, uint32_t size):
value(wrapped),
length(static_cast<uint16_t>(size)){
}

template< typename STREAM>
void read(STREAM &stream){
stream.readBytes(value, 0, length);
value.setLength(length);
}

};

template<typename T>
FixedSize<T> fixedSizeField(T &field, uint32_t length){
return FixedSize<T>(field, length);
}

理论上这将允许像这样调用解码

 x.decode(a,b,fixedSize(c,16), d);

然而,fixedSize() 返回的对象现在是一个 RValue,编译器拒绝使用

从右值初始化“FixedSize&”类型的非常量引用无效....

因为 RValue 持有对底层对象的引用,所以如果编译器允许我编译它,这段代码实际上可以工作。事实上,如果我创建一个 FixedSize 类型的对象,然后像这样将它传递给解码函数,它就可以工作。

 auto e = fixedSize(c,16)
x.decode(a,b, e, d)

我将如何强制编译器接受此处作为右值返回的包装对象?

最佳答案

不要;在任何地方转发参数(通过采用 Args&&... 并通过 std::forward(args)...),除了在头部,并进行重载。观察到包装器可能是一个常量;所以你可以把它当作一个 const& 并仍然通过引用修改目标。

此外,正如我所见,您不需要单独使用 decode() 和 internalDecode;只需保留 internalDecode() 并将其命名为 decode()。

关于c++ - 将包装器对象用作具有可变模板和引用参数的 RValue,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46607294/

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