废话不多说,直接上代码:
class ParaStream {
public:
explicit ParaStream() = default;
ParaStream(const ParaStream&) = delete;
ParaStream& operator=(const ParaStream&) = delete;
ParaStream(ParaStream&& para)
: sstream(std::move(para.sstream))
{
}
ParaStream& operator=(ParaStream&& para)
{
if (this == ¶) {
return *this;
}
sstream = std::move(para.sstream);
return *this;
}
ParaStream& operator<<(uint32_t val)
{
uint8_t arr[4];
memcpy(arr, &val, 4);
for (int i = 0; i < 4; i++) {
sstream.push_back(arr[i]);
}
return *this;
}
ParaStream& operator>>(uint8_t& val)
{
val = sstream.front();
sstream.erase(0, 1);
return *this;
}
private:
basic_string<uint8_t> sstream;
};
template <typename T>
class MoveWrapper {
public:
MoveWrapper() = default;
explicit MoveWrapper(T&& val)
: data(std::move(val))
{
}
MoveWrapper& operator=(const MoveWrapper&) = delete;
MoveWrapper& operator=(MoveWrapper&&) = delete;
MoveWrapper(const MoveWrapper& val)
: data(std::move(val.data))
{
}
MoveWrapper(MoveWrapper&& val)
: data(std::move(val.data))
{
}
T&& move() { return std::move(data); }
const T& operator*() const { return data; }
T& operator*() { return data; }
const T* operator->() const { return &data; }
T* operator->() { return &data; }
private:
mutable T data;
};
template <typename T, typename T0 = std::remove_reference_t<T>>
MoveWrapper<T0> makeMoveWrapper(T&& t)
{
return MoveWrapper<T0>(std::forward<T0>(t));
}
void testAddFunc(uint32_t id, vector<std::function<uint32_t()>>& sendList)
{
ParaStream stream;
stream << id;
// auto moveResult = makeMoveWrapper(std::move(stream));
auto moveResult = MoveWrapper<ParaStream>(std::move(stream));
std::function<uint32_t()> func = [moveResult]() mutable -> uint32_t {
ParaStream out = moveResult.move();
uint8_t v;
for (int i = 0; i < 4; i++) {
out >> v;
std::cout << v << ", ";
}
cout << endl;
return 0;
};
sendList.push_back(func);
}
int main()
{
vector<std::function<uint32_t()>> sendList;
testAddFunc(0x414141, sendList);
testAddFunc(17, sendList);
testAddFunc(71, sendList);
testAddFunc(100, sendList);
for (auto& func : sendList) {
(void)func();
}
return 0;
}
核心思想:拷贝函数干移动函数的事