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);