c++ - 如何将函数列表应用于 C++ 中的字符串?
问题描述
我有一个需要添加到单个字符串的函数列表。如何表达“应用”功能。
auto outPutString = inputString
.Apply(Transformation1)
.Apply(Transformation2)
在 C++ 中?
字符串是 std::string
解决方案
从 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«。
由于上述结构区分InputT
和OutputT
,因此您可以“混合”类型,如下所示:
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
方法的类。
推荐阅读
- node.js - 使用 npm 安装 Firebase 时出错
- android - 如何在 recyclerview 上设置 Checkbox 值并进行改造(Android 工作室)
- python - 将虚拟环境安装的包导入 Jupyter Notebook
- if-statement - 注入 IF 条件 Jenkinsfile
- mysql - 为什么 mysql 表信息显示只有 5 MB 的可用数据,但优化表将表大小从 800 GB 减少到 1 GB?
- reactjs - 我的 axios Post 请求在我的 Reacat 应用程序中不起作用
- sql - SQL 过滤帮助:col_name+1 和 col_name-1 有什么作用?
- visual-studio - 如何打开 NuGet 控制台
- c# - 如何全局声明一个变量,以便我可以在 mvc 中的所有其他 viwes 中访问它
- kubernetes - 从 kubernetes pod 挂载 nfsv4 时没有这样的文件或目录