gpt4 book ai didi

c++ - 模板函数分组值的更优雅方式?

转载 作者:行者123 更新时间:2023-11-30 05:18:41 24 4
gpt4 key购买 nike

以下代码使用通用分组 lambda 对任何容器的值进行分组:

template<class Iterator, class GroupingFunc,
class T = remove_reference_t<decltype(*declval<Iterator>())>,
class GroupingType = decltype(declval<GroupingFunc>()(declval<T&>()))>
auto groupValues(Iterator begin, Iterator end, GroupingFunc groupingFunc) {
map<GroupingType, list<T>> groups;
for_each(begin, end,
[&groups, groupingFunc](const auto& val){
groups[groupingFunc(val)].push_back(val);
} );
return groups;
}

具有以下用法:

int main() {
list<string> strs = {"hello", "world", "Hello", "World"};
auto groupOfStrings =
groupValues(strs.begin(), strs.end(),
[](auto& val) {
return (char)toupper(val.at(0));
});
print(groupOfStrings); // assume a print method

list<int> numbers = {1, 5, 10, 24, 13};
auto groupOfNumbers =
groupValues(numbers.begin(), numbers.end(),
[](int val) {
int decile = int(val / 10) * 10;
return to_string(decile) + '-' + to_string(decile + 9);
});
print(groupOfNumbers); // assume a print method
}

我有点不情愿在 groupValues 函数中(过度?)使用 declvaldecltype

你有没有更好的写法?

(问题主要是为了更好的风格和清晰度,当然除非您看到任何其他问题)。


代码:http://coliru.stacked-crooked.com/a/f65d4939b402a750

最佳答案

我可能会将最后两个模板参数移到函数中,并使用 std::result_of 来提供稍微更整洁的函数:

template <typename T>
using deref_iter_t = std::remove_reference_t<decltype(*std::declval<T>())>;

template<class Iterator, class GroupingFunc>
auto groupValues(Iterator begin, Iterator end, GroupingFunc groupingFunc) {
using T = deref_iter_t<Iterator>;
using GroupingType = std::result_of_t<GroupingFunc(T&)>;
std::map<GroupingType, std::list<T>> groups;
std::for_each(begin, end, [&groups, groupingFunc](const auto& val){
groups[groupingFunc(val)].push_back(val);
});
return groups;
}

live demo

关于c++ - 模板函数分组值的更优雅方式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41528157/

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