使用折叠表达式打印每个元素之间的空格
Print spaces between each element using a fold expression
我正在使用一个fold表达式来打印可变包中的元素,但如何在每个元素之间获得空间?
当前输出为"1 234",所需输出为"2 3 4">
template<typename T, typename Comp = std::less<T> >
struct Facility
{
template<T ... list>
struct List
{
static void print()
{
}
};
template<T head,T ... list>
struct List<head,list...>
{
static void print()
{
std::cout<<"""<<head<<" ";
(std::cout<<...<<list);
}
};
};
template<int ... intlist>
using IntList = typename Facility<int>::List<intlist...>;
int main()
{
using List1 = IntList<1,2,3,4>;
List1::print();
}
如果你只需要数字之间的空格(而不是在最后一个数字之后或第一个数字之前(,你可以这样做:
template <std::size_t... Is>
void print_seq(std::index_sequence<Is...>)
{
const char* sep = "";
(((std::cout << sep << Is), sep = " "), ...);
}
演示
(它类似于我的"运行时版本"(,用于带有for循环的常规容器。
您可以
#include <iostream>
template<typename T>
struct Facility
{
template<T head,T ... list>
struct List
{
static void print()
{
std::cout<<""" << head;
((std::cout << " " << list), ...);
std::cout<<""";
}
};
};
template<int ... intlist>
using IntList = typename Facility<int>::List<intlist...>;
int main()
{
using List1 = IntList<1,2,3,4>;
List1::print();
}
折叠表达式((std::cout << " " << list), ...)
将扩展为((std::cout << " " << list1), (std::cout << " " << list2), (std::cout << " " << list3)...)
通常,您会对这样的任务使用递归。
您必须定义当列表中有2个或多个元素和1个元素时会发生什么,并递归地返回到这些定义:
template <int ...> struct List;
template <int First, int Second, int ... More> struct List {
static void print() {
std::cout << First << " ";
List<Second, More ...>::print();
}
};
template <int Last> struct List {
static void print() {
std::cout << Last;
}
};
您可以重用print()
来实现这种行为。毕竟,你正在做一个fold
操作,根据定义,它是复活的。
实时演示
template<T head,T ... rest_of_pack>
struct List<head , rest_of_pack...>
{
static void print_()
{
std::cout<<head<<" ";
List<rest_of_pack...>::print();
}
};
如果您想以这种方式处理许多元素,您可能会遇到模板深度的问题(例如,gcc的限制为900
(。幸运的是,您可以使用-ftemplate-depth=
选项来调整这种行为。
您可以使用-ftemplate-depth=100000
进行编译并使其工作。请注意,编译时间会飙升(很可能(,或者在最坏的情况下内存会耗尽。
不完全符合这个问题,但我认为在这里提出一个基于fold表达式的解决方案可能会很有用,该解决方案可以从类似字符串的参数中生成字符串,从而最大限度地减少动态内存分配:
#include <iostream>
#include <concepts> // std::convertible_to
#include <string>
#include <string_view>
using namespace std::literals;
template<std::convertible_to<std::string_view>... Args>
[[nodiscard]] std::string mystrconcat(Args&&... args)
{
std::string s;
const std::size_t totsiz = sizeof...(args) + (std::size(args) + ...);
s.reserve(totsiz);
((s+=args, s+=' '), ...);
if(!s.empty()) s.resize(s.size()-1); // Get rid of the trailing delimiter?
return s;
}
int main()
{
std::cout << '"' << mystrconcat("aa"s,"bb"sv,"ccc") << '"' << 'n';
}
相关文章:
- 查找数组中第一个最小值和最后一个最大值元素之间的算术平均值
- 使用折叠表达式打印每个元素之间的空格
- 如何计算大小为 1000 x 1000 的 2D 数组中 2 个元素之间的步幅?C++
- OpenCV 文件存储 - 错误:元素之间的解析错误 (icvYMLParseValue) 缺失
- C++ - 前两个元素之间的差异
- 字符串和向量<string>元素之间的区别
- 当我删除数组时,指针在哪里?指向数组的指针与数组中的元素之间的区别
- 在给定某些约束的情况下,求出元素之间的最大距离
- 矢量<unique_ptr>元素之间的指针<myclass>
- 一种按排序顺序保持元素的数据结构,支持快速插入和计算连续元素之间的最大差异
- OpenGL:在两个元素之间画一条线
- 元素之间的输出逗号
- 是否保证 std::vector 不会在元素之间留下间隙
- 为什么我的程序是,数组中任意两个元素之间的最小差异,给出相反的结果
- 使用boost multiarray迭代器在数组元素之间进行赋值
- googletest匹配器,用于检查容器元素之间的关系
- C++数据结构,用于存储两组唯一元素之间的多个关系
- 为在unordered_set中查找指定元素之间的相等性
- 如何在两个容器的元素之间执行成对二进制操作?
- 如何获得两个std::set的元素之间的差异<string>?