我是C ++的新手,我似乎无法正确地表达我的问题,因为矢量化和映射的含义似乎与我所寻找的含义不同(因此,使用Google搜索解决方案很困难)。
我有许多函数作用于任意类型的单个对象。我想要一种通用方法(即模板或包装函数)将它们转换为作用于任意数量的相同类型对象的向量的函数。一个例子:
strrpos()
模板似乎是必需的,但是我对它们还没有太多的经验,也不知道在这种情况下如何应用它们。欢迎任何参考/建议/意见。 (还请添加相关标签-因为我不确定为此使用的正确术语,因此不确定如何对其进行标签。)
答案 0 :(得分:3)
此代码确实确实适合某些模板。
template <typename T, typename TFunc>
std::vector<T> transform(const std::vector<T> &v, TFunc &&func)
{
std::vector<T> result;
result.reserve(v.size());
for (auto &&element : v)
result.push_back(std::invoke(func, element));
return result;
}
您可能会注意到,该函数看起来与std::transform
非常相似,它在迭代器而不是向量上起作用。可以称为:
auto result = transform(v, &func1);
答案 1 :(得分:1)
是的,您将需要模板,因为您不知道将使用此矢量化功能的类型。
让我们尝试一下:
<template>
<!-- v-bind 'setting' data to config file uploader -->
<!-- bind event 'done' to receive file uploaded info -->
<v-uploader :setting="uploadConfig" @done="uploadDone" ></v-uploader>
</template>
<style lang="css">
.info-show{
margin-top:10px;
}
</style>
<script>
export default {
data(){
return {
uploadConfig: {
multiple: true,
language: 'en', //default: 'cn'
itemLimit: 5,
fileSizeLimit:'3MB',
fileTypeExts: ['jpeg', 'jpg', 'png']
}
}
},
methods:{
//receive file uploaded info
//@type Array
uploadDone(files){
if(files && Array.isArray(files) && files.length){
// do something...
}
}
}
};
</script>
答案 2 :(得分:1)
正如评论中提到的@ paler123一样,您可以使用std::transform
来完成这项工作以及一个小的模板化函数。
由于您的两个函数在函数签名上具有相似性
i.e, Type function(Type arg)
我选择键入函数指针作为模板函数参数。
template<typename Type>
std::vector<Type> func(const std::vector<Type>& a_vec, Type(*func)(Type))
{
std::vector<Type> out_vec; out_vec.reserve(a_vec.size());
std::transform(a_vec.begin(), a_vec.end(), std::back_inserter(out_vec), func);
return out_vec;
}
现在在main()
中,您可以显式指定类型,也可以保留原样,让编译器进行类型推导。
auto result = func<int>({ 1,2,3,4 }, func1);
// also can
auto result2 = func({ 1, 2, 3, 4 }, func2);