gpt4 book ai didi

c++ - 在 C++ 中链接可调用对象

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

我来自 python 世界,在那里我可以定义一系列操作并在 for 循环中调用它们:

class AddOne:
def __call__(self, x, **common_kwargs):
return x+1
class Stringify:
def __call__(self, x, **common_kwargs):
return str(x)
class WrapNicely:
def __call__(self, s, **common_kwargs):
return "result="+s
data = 42
for operation in [AddOne(), Stringify(), WrapNicely()]:
data = operation(data)
output = data

(注意:目标是进行复杂的操作。理想情况下,可以给出常见的 kwargs)

如果每次调用后的返回类型都不同,C++ 中的等价物是什么?

我不确定我能找到任何接近的东西,但我可能搜索了错误的关键字......

最佳答案

C++ 是静态类型的,所以这里的选项是有限的:

  • 创建可在编译时确定的函数链。
  • 创建参数和返回类型相同的函数
  • 返回一个可以“存储多个替代类型”的类型,例如 std::variant

对于第一个替代方案,您可以创建一个通过递归调用执行函数的类模板,但它比您的 Python 代码复杂一点:

template<class...Fs>
class Functions
{
std::tuple<Fs...> m_functions;

template<size_t index, class Arg>
decltype(auto) CallHelper(Arg&& arg)
{
if constexpr (index == 0)
{
return std::forward<Arg>(arg);
}
else
{
return std::get<index - 1>(m_functions)(CallHelper<index - 1>(std::forward<Arg>(arg)));
}
}

public:
Functions(Fs...functions)
: m_functions(functions...)
{
}

template<class Arg>
decltype(auto) operator()(Arg&& arg)
{
return CallHelper<sizeof...(Fs)>(std::forward<Arg>(arg));
}
};

int main() {
Functions f{
[](int x) { return x + 1; },
[](int x) { return std::to_string(x); },
[](std::string const& s) { return "result=" + s; }
};

std::cout << f(42) << '\n';
}

注意:这需要使用至少 C++17 的 C++ 标准。

关于c++ - 在 C++ 中链接可调用对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75039429/

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