1

我在这里有一个非常复杂的例子:

auto someClassFactory(const Arg1& arg1, const Arg2& arg2, const Arg3)
{
    auto lambda = [arg1](const SomeArg& a) {
        // 10 or so line lambda...
        // ...
        // ...
    };

    return SomeClass<decltype(lambda)>{arg2, arg3, lambda};
}

我有一堆类似的工厂函数,用于使用各种不同的仿函数构造 SomeClass。

使用上述没有尾随返回类型的技术可以很好地在gcc 4.8上使用-std=c++1y进行编译,但我还不热衷于使用c++1y功能,也不热衷于使用巨大的、尾随返回类型的代码重复。decltype

还有哪些其他选项可以推导出用于返回类型的 lambda?

我考虑过使用std::function,但在这种情况下更愿意避免使用它。

4

2 回答 2

2

将 lambda 替换为显式仿函数。

或者,创建一个make_class完美转发 lambda 并将其类型推导出为some_class构造函数的函数,依靠 RVO 省略任何副本或用于{direct construction}显式构造返回值,也许是一个RETURNS宏:

#define RETURNS(x) ->decltype(x) { return (x); }

......现在我想它不起作用,因为我们在未评估的上下文中得到了一个 lambda。

于 2013-10-02T04:08:11.787 回答
1

一般来说,对抗模板引起的代码膨胀的唯一方法是排除与模板无关的代码,擦除类型,或两者的混合。

至于因式分解独立于模板的代码,如果 Arg1 和 SomeArg 不是模板参数,则可以完全将 lambda 分解为独立函数的形式。如果它们是模板参数,您可能仍然能够从 lambda 中分解出与模板无关的逻辑部分,并最大限度地减少膨胀。

至于类型擦除,您可以求助于 a) 虚拟基类与派生模板类(这实际上是 std::function 在后台使用的),b) 使用 C 风格的 void (*)( void * ) 函数指针,或依赖 c) 非标准技巧,例如:成员函数指针和最快的 C++ 委托

你在这里踩着语言的尘土飞扬的角落。忠告:为自己保存一个受伤的世界,并保持简单。

于 2013-10-02T04:36:38.953 回答