【发布时间】:2018-08-10 02:47:23
【问题描述】:
我编写了一个模板函数,该函数旨在接受一个 lambda 和一组参数。我已将函数的返回类型声明为 lambda 的返回类型。有没有一种方法可以让我的模板函数专门用于某些 lambda 参数返回类型?
我的代码的工作部分如下:
template <typename F, typename ... T>
auto crudeProfile(F f, T ... args) -> decltype(f(args...)) {...}
这正如我所期望的那样工作。但我想将其行为专门用于返回 void 的 lambda。到目前为止,我只提出了以下代码:
template <typename F, typename ... T>
void crudeProfile(F f, T ... args) {...}
但是当我尝试使用它时编译器会抱怨这个:
1>Source.cpp(684): error C2668: 'crudeProfile': ambiguous call to overloaded function
1> Source.cpp(637): note: could be 'void crudeProfile<main::<lambda_a7118596c99e3162db30942634c4e81e>,>(F)'
1> with
1> [
1> F=main::<lambda_a7118596c99e3162db30942634c4e81e>
1> ]
1> Source.cpp(624): note: or 'void crudeProfile<main::<lambda_a7118596c99e3162db30942634c4e81e>,>(F)'
1> with
1> [
1> F=main::<lambda_a7118596c99e3162db30942634c4e81e>
1> ]
1> Source.cpp(684): note: while trying to match the argument list '(main::<lambda_a7118596c99e3162db30942634c4e81e>)'
即使返回非 void 的 lambdas 也会导致此错误,尽管错误会略有变化,改为“可能是 'type' 或 void”(其中 'type' 是 lambda 返回类型)。
【问题讨论】:
-
你可以访问 C++17 吗?
-
升级可能不会对我造成伤害,但现在我相信我使用的是 C++11-MSVC++ 2015,宏 __cplusplus == 199711
-
我认为即使返回类型为 void 和适当的 RAII,您也可以相同地编写函数。
-
您可以查看与我的answer 类似的问题。