gpt4 book ai didi

c++ - 什么是 C++ 方法而不是使用函数指针来做到这一点?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:06:08 25 4
gpt4 key购买 nike

我正在开发一个程序的一部分,该程序将不同类型的滤镜应用于位图图像的已读取数据部分。所讨论的方法获取存储在 2-dim std::vector 中的数据,此外还有一个指向应用过滤器作为参数的函数的指针。通过这种方式,我们可以通用地应用不同的过滤器。我的问题是,函数指针是实现这一目标的唯一方法,还是 C++ 提供了更美观、更易读的解决方案来实现它?

这就是这个问题的方法。第二个参数是函数指针,用于访问 for 循环内 if/else 语句中的函数。

void SteganoMessage::genFilter(std::vector<std::vector<uint32_t>> *d, uint32_t (*f)(uint32_t, size_t)){
int count = 0;
int pixel = getPixel();
for(auto itOuter = d->begin(); itOuter != d->end(); ++itOuter){
for(auto itInner = itOuter->begin(); itInner != itOuter->end(); ++itInner){
if(mode == true)
*itInner = f(*itInner, sizeof(*itInner));
else
*itInner = f(*itInner, this->getImage()->getBitmapHeader()->getBitCount()/8);
displayProgress(count, pixel);
}
}
displayProgress(0);
}

genFilter函数的调用:

//...
{
genFilter(data, substB);
}
//...

substB 当然是一个函数。

如果有提示可以引导我进入我可以研究的正确方向,或者有代码片段可以显示更像 C++ 的方法,我将不胜感激。

最佳答案

类型保留

在 C++ 中传递函数(或可以是 INVOKEd 的东西)的常用方法是使用模板参数:

// version #1
template <typename F>
void func(F f)
{
static_assert(std::is_invocable_v<F, std::uint32_t, std::size_t>);

// instead of f(*itInner, sizeof(*itInner))
std::invoke(f, *itInner, sizeof(*itInner));
}

您还可以使用 SFINAE 来防止将错误推迟到实例化时间。这也启用了重载:

// version #2
template <typename F>
std::enable_if_t<std::is_invocable_v<F, std::uint32_t, std::size_t>>
func(F f)
{
// no need to static_assert here
std::invoke(f, *itInner, sizeof(*itInner));
}

从 C++20 开始,我们可以使用概念:

// version #3
template <std::Invocable<std::uint32_t, std::size_t> F>
void func(F f)
{
// same as above
}

可以使用缩写函数模板进一步简化为:

// version #4
void func(std::Invocable<std::uint32_t, std::size_t> auto f)
{
// same as above
}

(这仍然是一个函数模板,而不是一个普通的函数。它相当于版本#3。)

类型删除

您还可以使用 std::function 进行类型删除:

// version #5
void func(std::function<void(std::uint32_t, std::size_t)> f)
{
// ...
f(*itInner, sizeof(*itInner));
}

与保留类型的替代方案(版本 #1-4)相比,这种方法可以减少代码膨胀,但可能会导致调用虚函数的运行时开销。

关于c++ - 什么是 C++ 方法而不是使用函数指针来做到这一点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56472546/

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