【发布时间】:2015-10-21 16:31:48
【问题描述】:
我想让带有可变参数模板参数列表的无状态 lambda 函数递归。但我需要类型擦除以避免像variable 'lambda' declared with 'auto' type cannot appear in its own initializer 这样的错误。可变模板参数列表需要对应的功能对象模板化operator ()。对于简单的无状态 lambda 函数,我可以将其转换为指向简单的免费旧函数的指针,但是如何实现类似的 variadic 无状态 lambda 函数?我想我想要的是模板参数列表的自动类型推导(在模板变量的实例化期间:在调用期间或在赋值期间):(伪代码)
#include <type_traits>
#include <iostream>
#include <cstdlib>
template< typename first, typename second, typename ...rest >
using fp = first (*)(first const &, second const &, rest const &...); // at least binary function
int
main()
{
template fp sum = [] (auto const & first, decltype(first) second, auto const &... rest) { return first + sum(second, rest...); };
// ^ assignment ^ call
std::cout << sum(1, 2.0, 3.0f) << std::endl;
return EXIT_SUCCESS;
}
目前是否有可能实现这种行为(C++14)(例如,使用std::function 或其他类型擦除方式)?是否有类似语言功能的建议?或者可能已经被现有的语言规则完全禁止?
另一个可能有用的例子:(伪代码)
template std::vector v{1, 2, 3};
static_assert(std::is_same< decltype(v), std::vector< int > >{});
【问题讨论】:
-
你能发布示例代码来触发你提到的错误
variable 'lambda' declared with 'auto' type cannot appear in its own initializer吗? -
@m.s.
auto lambda = [] (auto const & first, decltype(first) second, auto const &... rest) { return first + lambda(second, rest...); };这里的 lambda 变量应该默认按值捕获([&]或[&lambda]也是如此)。 -
对于第二个例子,Template parameter deduction for constructors (Rev. 3) 可能会有所帮助。
标签: c++ templates c++11 c++14 type-deduction