gpt4 book ai didi

c++ - 在函数对象中包装模板或重载函数的最简洁和可重用的方式

转载 作者:行者123 更新时间:2023-12-05 02:02:22 24 4
gpt4 key购买 nike

场景一:模板函数pred

template<typename T>
bool pred(T t) { /* return a bool based on t */ }

场景 2:一组函数在同名 pred 上重载

bool pred(A t) { /* return a bool based on t */ }
bool pred(B t) { /* return a bool based on t */ }
bool pred(C t) { /* return a bool based on t */ }
...

无论我们处于这两种情况中的哪一种,最重要的是 pred 不引用函数,因此它不能被传递,例如作为 std::remove_if 的一元谓词。

因此在这种情况下定义以下可以传递的对象很方便,

auto constexpr predObj = [](auto t){ return pred(t); };

但是,一旦我对另一个一元谓词有类似的需求,我就需要复制并粘贴该行并将两个名称更改为其他名称;同样,如果我需要为二元谓词执行此操作:

auto contexpr binPredObj = [](auto x, auto y){ return binPred(x, y); };

是否有一种通用的方法可以自动执行此操作?我在想类似的事情

auto funObj = fun2Obj(fun);

我觉得我的要求是不可能的,因为它需要传递 fun 因为它是一个函数对象,而事实并非如此,否则我不需要做一个函数对象。但是问永远不是犯罪,对吧?

最佳答案

你可以创建一个宏

#define FUNCTORIZE(func) [](auto&&... val) \
noexcept(noexcept(func(std::forward<decltype(val)>(val)...))) -> decltype(auto) \
{return func(std::forward<decltype(val)>(val)...);}

这将使您可以将任何可调用对象包装到闭包对象中。你会像这样使用它

auto constexpr predObj = FUNCTORIZE(pred);

关于c++ - 在函数对象中包装模板或重载函数的最简洁和可重用的方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65811716/

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