C++ Boost递归变量
我想做的基本上是(简化但再现问题): 这是一份汇编。到现在为止,一直都还不错。但是当我尝试使用它时C++ Boost递归变量,c++,boost,variant,C++,Boost,Variant,我想做的基本上是(简化但再现问题): 这是一份汇编。到现在为止,一直都还不错。但是当我尝试使用它时 my_variant_t x = [](my_variant_t p) {}; 然后它失败了。。。大量的编译器输出。。。但是我认为未能专门化函数模板是重要的一点 通过反复试验,我发现如果我改为这样编写lambda,我可以编译它: my_variant_t x = [](recursive_variant_ p) {}; 但这不是我所期望的。根据文档,我希望能够引用结果变量类型my\u vari
my_variant_t x = [](my_variant_t p) {};
然后它失败了。。。大量的编译器输出。。。但是我认为未能专门化函数模板
是重要的一点
通过反复试验,我发现如果我改为这样编写lambda,我可以编译它:
my_variant_t x = [](recursive_variant_ p) {};
但这不是我所期望的。根据文档,我希望能够引用结果变量类型my\u variant\u t
。更糟糕的是,当我试图调用这个lambda
x(42);
然后它失败,调用的不匹配
我想我遗漏了什么或者在某种程度上滥用了变体。有人能帮我解决这个问题吗?您对递归变量占位符系统的期望太高了
库在模板参数列表中发现并替换类型是一回事(如std::vector
,其中
是例如递归变量
占位符)
在模板参数列表中的函数签名中检测(并替换)占位符完全是另一回事
我不确定这是否可以完成,但这将非常困难(在编译过程中正确地使用编译器)事实上,我认为这是mpl占位符的一个限制,它们在x
,x
等模板中工作,但不是x
。幸运的是,有一种形式的boost::function
将存储函数的签名作为类型序列()。关于函数调用操作符,他不能这样使用它,因为variant
没有定义它,他需要使用访问者,但我不确定它是否有意义(你如何调用3(42)
?或者f(42)
(其中f以“函数作为参数”)。@cv\u和\u he✔ 使用boost函数1成功了。调用variant函数也很棘手,这一点您是对的。我不得不把它写成boost::get(x)(42)代码>
my_variant_t x = [](recursive_variant_ p) {};
x(42);