gpt4 book ai didi

c++ - 创建一个可以在没有 experimental::any 的情况下变形类型的管道

转载 作者:搜寻专家 更新时间:2023-10-31 00:53:47 28 4
gpt4 key购买 nike

我正在尝试创建一个管道实现,该实现将公开一个接口(interface)以链接对某些给定数据的多个操作,同时保持所述数据的不变性。这里需要注意的是,操作(显然只是纯函数)应该能够改变数据的类型(例如,从应该通过 OCR 工具的 OpenCV 垫创建的管道,这将导致字符串输出)。也就是说,我做了这个利用 std::experimental::any 的实现。

class Pipe {
any data;

public:
Pipe (any data) : data(data) {}
any unpack () {
return data;
}

Pipe operator| (function<any(any)> reducer) {
return Pipe(reducer(this->unpack()));
}

Pipe operator|| (any & destination) {
destination = unpack();
return *this;
}

static Pipe from (any data) {
return Pipe(data);
}
};

所以这个管道的 API 如下:

Pipe::from(some_data) | do_something | do_something_else || unpacked

嗯,它有效。问题在于它很容易出错,因为任何时候您都必须使用显式 any_cast 来实际访问被 any 隐藏的数据。也就是说,任何 reducer 函数都必须猜测它将接收什么类型,如果这与实际情况不符,那就是运行时错误,即代码中有很多不必要的 try-catch 或其他内容,以及那些额外的行用于显式类型转换。

所以我有两个关于这个“ pipe ”的问题。

  1. 是否有可能减少这种错误的发生?
  2. 是否可以在不使用any的情况下达到同样的效果?也许一些模板类,任何东西都可以。

最佳答案

Template 确实可以删除 any 的使用,比如:

template <typename T>
class Pipe {
T data;

public:
Pipe (T data) : data(data) {}
const T& unpack () const { return data; }
T& unpack () { return data; }

template <typename F>
auto operator| (F reducer) -> decltype(reducer(std::declval<T>()))
{
return Pipe<decltype(reducer(data))>(reducer(data));
}

Pipe operator|| (T& destination) const
{
destination = unpack();
return *this;
}

};

template <typename T>
Pipe<T> MakePipe(T data) {
return Pipe<T>(data);
}

用法是

MakePipe(some_data) | do_something | do_something_else || unpacked;

关于c++ - 创建一个可以在没有 experimental::any 的情况下变形类型的管道,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47557422/

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