首页 > 解决方案 > 如何将函数列表应用于 C++ 中的字符串?

问题描述

我有一个需要添加到单个字符串的函数列表。如何表达“应用”功能。

auto outPutString = inputString
.Apply(Transformation1)
.Apply(Transformation2)

在 C++ 中?

字符串是 std::string

标签: c++algorithm

解决方案


从 C++ 11 开始,您还可以Apply使用可变参数模板编写函数:

template <typename OutputT, typename InputT>
OutputT Apply(const InputT &obj)
{
    return obj;
}

template <typename OutputT, typename InputT, typename Func, typename... OtherFuncs>
OutputT Apply(const InputT &obj, Func f, OtherFuncs... other)
{
    return Apply<OutputT, decltype(f(obj))>(f(obj), other...);
}

然后您可以按如下方式使用它:

auto res = Apply<std::string>(
    "Hello",
    [](const std::string &str) { return str + " "; },    // Applicator 1
    [](const std::string &str) { return str + "World"; } // Applicator 2
);

在这种情况下,结果是 »Hello World«。

由于上述结构区分InputTOutputT,因此您可以“混合”类型,如下所示:

auto res = Apply<size_t>(
    "Hello",
    [](const std::string &str) { return str + " World"; }, // Applicator 1
    [](const std::string &str) { return str.size(); }      // Applicator 2
);

这一次的结果是11

最后,如果您真的想使用链接语法,您可以编写一个包装初始对象并具有Apply方法的类。


推荐阅读