我正在使用 boost::fusion。
假设我有如下内容:
make_vector(1, make_vector('b', 3, make_vector(4, 5.5), "six"), 7, 8)
我想生成一个函数 f 使得
f(make_vector(1, make_vector('b', 3, make_vector(4, 5.5), "six"), 7, 8))
-> [1, 'b', 3, 4, 5.5, "six", 7, 8]
即序列的扁平化版本。
我不介意这是原始序列的 View 还是实际 vector 。
如果它可以在 GCC 4.5.1 上编译,我不介意 C++0x 中的解决方案。
注意:
虽然我不想限制数据元素,但如果有帮助,请随意要求“数据”元素全部派生自一个公共(public)基类。
即
class DataBase {}
template <class T>
class Data : public DataBase
{
public:
Data(const T& x) : m_x(x)
T m_x;
}
template <class T>
T make_data(const T& x) { return Data<T>(x); }
然后
make_vector(
make_data(1),
make_vector(
make_data('b'),
make_data(3),
make_vector(
make_data(4),
make_data(5.5)
),
make_data("six")
),
make_data(7),
make_data(8)
)
我想您可以使用“is_base_of”算出数据元素是什么。
最佳答案
这是一种可能的解决方案,它使用 join递归地。基本上,它执行以下操作(在伪 Haskell 中):
flatten [] = []
flatten x = [x]
flatten (x:xs) = flatten x ++ flatten xs
递归地,扁平化的头部连接到扁平化的尾部。
这个解决方案很可能不是最有效的解决方案,因为它构建了许多 View ,即使是单个值也是如此;更好的方法是将结果序列作为参数传递给递归调用,并直接在其中添加各个元素,也许使用 fold。 .
这是代码(免责声明:我写得很快,所以代码可能充满错误和/或非惯用的做事方式):
namespace result_of
{
template < typename Begin, typename End, class Enable = void >
struct flatten_impl
{
typedef boost::fusion::single_view< typename
boost::fusion::result_of::value_of< Begin >::type
> flattenedHeadSequence;
typedef typename
flatten_impl< typename
boost::fusion::result_of::next< Begin >::type,
End
>::type flattenedTailSequence;
typedef typename boost::fusion::result_of::join< const flattenedHeadSequence, const flattenedTailSequence >::type type;
};
template < typename Begin, typename End >
struct flatten_impl<
Begin,
End, typename
boost::enable_if<
boost::fusion::traits::is_sequence< typename
boost::fusion::result_of::value_of< Begin >::type
>
>::type
>
{
typedef typename boost::fusion::result_of::value_of< Begin >::type headSequence;
typedef typename
flatten_impl< typename
boost::fusion::result_of::begin< headSequence >::type, typename
boost::fusion::result_of::end< headSequence >::type
>::type flattenedHeadSequence;
typedef typename
flatten_impl< typename
boost::fusion::result_of::next< Begin >::type,
End
>::type flattenedTailSequence;
typedef typename boost::fusion::result_of::join< const flattenedHeadSequence, const flattenedTailSequence >::type type;
};
template < typename End, typename Enable >
struct flatten_impl< End, End, Enable >
{
typedef boost::fusion::vector< > type;
};
template < typename Sequence >
struct flatten
{
typedef typename
flatten_impl< typename
boost::fusion::result_of::begin< Sequence >::type, typename
boost::fusion::result_of::end< Sequence >::type
>::type type;
};
}
template < typename Begin, typename End >
typename result_of::flatten_impl< Begin, End >::type
flatten_impl(
const Begin & begin,
const End & end, typename
boost::disable_if<
boost::fusion::traits::is_sequence< typename
boost::fusion::result_of::value_of< Begin >::type
>
>::type * dummy = 0 )
{
typedef result_of::flatten_impl< Begin, End > traits;
typedef typename traits::flattenedHeadSequence headSequence;
typedef typename traits::flattenedTailSequence tailSequence;
return boost::fusion::join(
headSequence( boost::fusion::deref( begin ) ),
flatten_impl( boost::fusion::next( begin ), end ) );
}
template < typename Begin, typename End >
typename result_of::flatten_impl< Begin, End >::type
flatten_impl(
const Begin & begin,
const End & end, typename
boost::enable_if<
boost::fusion::traits::is_sequence< typename
boost::fusion::result_of::value_of< Begin >::type
>
>::type * dummy = 0 )
{
typedef result_of::flatten_impl< Begin, End > traits;
typedef typename traits::flattenedHeadSequence headSequence;
typedef typename traits::flattenedTailSequence tailSequence;
typedef typename boost::fusion::result_of::value_of< Begin >::type headType;
const headType & head = boost::fusion::deref( begin );
return boost::fusion::join(
flatten_impl( boost::fusion::begin( head ), boost::fusion::end( head ) ),
flatten_impl( boost::fusion::next( begin ), end ) );
}
template < typename End >
typename result_of::flatten_impl< End, End >::type
flatten_impl( const End &, const End &)
{
return boost::fusion::make_vector( );
}
template < typename Sequence >
typename result_of::flatten< Sequence >::type
flatten( const Sequence & seq )
{
return flatten_impl( boost::fusion::begin( seq ), boost::fusion::end( seq ) );
}
关于c++ - 展平一系列序列(序列),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4374851/
关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。
我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server
这里是Ruby新手。完成一些练习后碰壁了。练习:计算一系列成绩的字母等级创建一个方法get_grade来接受测试分数数组。数组中的每个分数应介于0和100之间,其中100是最大分数。计算平均分并将字母等级作为字符串返回,即“A”、“B”、“C”、“D”、“E”或“F”。我一直返回错误:avg.rb:1:syntaxerror,unexpectedtLBRACK,expecting')'defget_grade([100,90,80])^avg.rb:1:syntaxerror,unexpected')',expecting$end这是我目前所拥有的。我想坚持使用下面的方法或.join,
给定一个复杂的对象层次结构,幸运的是它不包含循环引用,我如何实现支持各种格式的序列化?我不是来讨论实际实现的。相反,我正在寻找可能会派上用场的设计模式提示。更准确地说:我正在使用Ruby,我想解析XML和JSON数据以构建复杂的对象层次结构。此外,应该可以将该层次结构序列化为JSON、XML和可能的HTML。我可以为此使用Builder模式吗?在任何提到的情况下,我都有某种结构化数据-无论是在内存中还是文本中-我想用它来构建其他东西。我认为将序列化逻辑与实际业务逻辑分开会很好,这样我以后就可以轻松支持多种XML格式。 最佳答案 我最
在应用开发中,有时候我们需要获取系统的设备信息,用于数据上报和行为分析。那在鸿蒙系统中,我们应该怎么去获取设备的系统信息呢,比如说获取手机的系统版本号、手机的制造商、手机型号等数据。1、获取方式这里分为两种情况,一种是设备信息的获取,一种是系统信息的获取。1.1、获取设备信息获取设备信息,鸿蒙的SDK包为我们提供了DeviceInfo类,通过该类的一些静态方法,可以获取设备信息,DeviceInfo类的包路径为:ohos.system.DeviceInfo.具体的方法如下:ModifierandTypeMethodDescriptionstatic StringgetAbiList()Obt
如何将send与+=一起使用?a=20;a.send"+=",10undefinedmethod`+='for20:Fixnuma=20;a+=10=>30 最佳答案 恐怕你不能。+=不是方法,而是语法糖。参见http://www.ruby-doc.org/docs/ProgrammingRuby/html/tut_expressions.html它说Incommonwithmanyotherlanguages,Rubyhasasyntacticshortcut:a=a+2maybewrittenasa+=2.你能做的最好的事情是:
基础版云数据库RDS的产品系列包括基础版、高可用版、集群版、三节点企业版,本文介绍基础版实例的相关信息。RDS基础版实例也称为单机版实例,只有单个数据库节点,计算与存储分离,性价比超高。说明RDS基础版实例只有一个数据库节点,没有备节点作为热备份,因此当该节点意外宕机或者执行重启实例、变更配置、版本升级等任务时,会出现较长时间的不可用。如果业务对数据库的可用性要求较高,不建议使用基础版实例,可选择其他系列(如高可用版),部分基础版实例也支持升级为高可用版。基础版与高可用版的对比拓扑图如下所示。优势 性能由于不提供备节点,主节点不会因为实时的数据库复制而产生额外的性能开销,因此基础版的性能相对于
我对如何计算通过{%assignvar=0%}赋值的变量加一完全感到困惑。这应该是最简单的任务。到目前为止,这是我尝试过的:{%assignamount=0%}{%forvariantinproduct.variants%}{%assignamount=amount+1%}{%endfor%}Amount:{{amount}}结果总是0。也许我忽略了一些明显的东西。也许有更好的方法。我想要存档的只是获取运行的迭代次数。 最佳答案 因为{{incrementamount}}将输出您的变量值并且不会影响{%assign%}定义的变量,我
假设我必须(小型到中型)阵列:tokens=["aaa","ccc","xxx","bbb","ccc","yyy","zzz"]template=["aaa","bbb","ccc"]如何确定tokens是否以相同的顺序包含template的所有条目?(请注意,在上面的示例中,应忽略第一个“ccc”,从而由于最后一个“ccc”而导致匹配。) 最佳答案 这适用于您的示例数据。tokens=["aaa","ccc","xxx","bbb","ccc","yyy","zzz"]template=["aaa","bbb","ccc"]po
我有一个数组数组,想将元素附加到子数组。+=做我想做的,但我想了解为什么push不做。我期望的行为(并与+=一起工作):b=Array.new(3,[])b[0]+=["apple"]b[1]+=["orange"]b[2]+=["frog"]b=>[["苹果"],["橙子"],["Frog"]]通过推送,我将推送的元素附加到每个子数组(为什么?):a=Array.new(3,[])a[0].push("apple")a[1].push("orange")a[2].push("frog")a=>[[“苹果”、“橙子”、“Frog”]、[“苹果”、“橙子”、“Frog”]、[“苹果”、“