C++ 在编译时使用已知的N重复std::tuple

C++ 在编译时使用已知的N重复std::tuple,c++,boost-spirit-x3,C++,Boost Spirit X3,我想在编译时解析指定数量的元素。我已经尝试了repeat()[]指令。以下代码显示了我的案例: using namespace x3; std::tuple<float, float, float> tup; std::string str{"0.3 0.2 0.1"}; auto ret = parse(std::begin(str), std::end(str), repeat(3)[ float_ >> (' ' | eol) ] , tup); 但由于

我想在编译时解析指定数量的元素。我已经尝试了
repeat()[]
指令。以下代码显示了我的案例:

 using namespace x3;
 std::tuple<float, float, float> tup;
 std::string str{"0.3 0.2 0.1"};
 auto ret = parse(std::begin(str), std::end(str), repeat(3)[ float_ >> (' ' | eol) ] , tup); 
但由于有大量的元素,这是一种混乱

有没有一种方法可以用“repeat”指令来缩短语法?

正如您可以看到的那样,
x3::repeat(3)[x3::float\
的合成属性是一个
向量,它与您的属性不匹配(基本上是一个大小为3的融合序列)。请注意,合成属性不依赖于传递的值

为了得到您想要的,您需要另一个指令,它的类型取决于您传递的值。然后,该指令将生成一个序列,其中其主题重复N次(简单地将工作“委派”到
x3::sequence
将确保在属性传播方面一切正常)。我至少可以想到两种方法:类似于
repeat[parser]
或类似于
repeat(integral\u constant)[parser]
。在下面的代码中,我选择了使用的第二种方法,它允许您使用:

custom::repeat(3_c)[ x3::float_ >> (' ' | x3::eol | x3::eoi) ]
完整代码

自定义_repeat.hpp

#包括
#包括
命名空间自定义
{
结构重复生成
{
模板
结构重复\u gen\u lvl1
{
//使用带整型常量的重载以避免需要部分专门化函数
//这实际上构建了解析器序列
模板
自动生成_序列(解析器常量和解析器,std::integral_常量)常量
{
返回generate_序列(解析器,std::integral_常量{})>>解析器;
}
模板
自动生成_序列(Parser const Parser,std::integral_constant)const
{
返回解析器;
}
模板
自动运算符[](主题常量和主题)常量
{
//这里生成了实际的序列
返回generate_序列(boost::spirit::x3::as_解析器(subject),std::integral_常量{});
}
};
模板
重复第1层
运算符()(IntConstant)常量
{
//返回一个对象,该对象知道所需序列的大小,并且具有将捕获主题的运算符[]
返回{};
}
模板
自动运算符()(整数类型n)常量
{
返回升压::精神::x3::重复(n);
}
};
//此对象的唯一用途是拥有运算符()
auto const repeat=repeat_gen{};
}
main.cpp

#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括“自定义_repeat.hpp”
名称空间x3=boost::spirit::x3;
使用名称空间boost::hana::literals;
模板
无效打印属性(常量标准::向量和向量)
{

std::cout@sehe,amazing,我需要一些时间来理解这一点。我考虑过重复之类的事情。如果你通过运行时
3
,你的自定义
repeat
可能会退回到x3的repeat并返回一个向量。@LouisDionne好主意。我在实现它时的“懒散性”(
auto
作为返回类型)这让我意识到我的整个指令方法可以简化。
parse(std::begin(str), std::end(str), float_ >> ' ' >> float_ >> ' ' >> float_ ] , tup);
custom::repeat(3_c)[ x3::float_ >> (' ' | x3::eol | x3::eoi) ]