gpt4 book ai didi

c++ - 从仿函数模板参数(特定于 MSVC)推导可变参数和返回类型

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:42:50 24 4
gpt4 key购买 nike

以下代码中的函数 invoke 是调用另一个函数/仿函数/lambda 的简单包装器,这样 invoke(f,args...) 等于 f(args...)。 (这背后的原因是成员函数也有重载,允许两种用法的通用语法。)

此实现适用于 g++:

template <class Fn, class ...Args>
auto invoke(Fn f, Args ...args) -> decltype(f(args...)) {
return f(args...);
}

int y = invoke([](int x){ return x+1; }, 42); // y = 43

Demo

但是,MSVC 2012(11 月 CTP)提示:

Error: C2893: Failed to specialize function template 'unknown-type invoke(Fn,Args...)'
With the following template arguments:
'main::<lambda_687537b292ffb7afcfd8f8fc292d6e73>'
'int'

(请注意,错误消息中的 int 来自传递给 invoke42,而不是来自 lambda 的参数。我检查过这通过将不同的东西传递给 invoke。)

如何解决此问题以使用 MSVC 2012(11 月 CTP)?

我尝试过的事情:

  • 当我将可变参数模板参数更改为单个参数(但仍然是模板参数,即删除上面代码中的所有 ...)时,代码编译。但我需要支持任意数量的论点。

  • 如果我将尾随返回类型替换为非泛型 int 返回类型,它也会编译。但显然我想支持通用返回类型。

  • 如果我传递函数指针而不是 lambda,行为不会改变。所以它与 lambda 无关。示例错误消息:

    Error: C2893: Failed to specialize function template 'unknown-type invoke(Fn,Args...)'
    With the following template arguments:
    'int (__cdecl *)(int)'
    'double'

最佳答案

尝试使用 typename result_of<F(Args...)>::type . (我的意思是这样:使用类型而不是值)。

这不支持标准下的 SFINAE,但如果可以在半兼容的 C++11 编译器中工作。

也可以使用 Args&&...如果你的编译器没有崩溃,就完美前进。

关于c++ - 从仿函数模板参数(特定于 MSVC)推导可变参数和返回类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26006750/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com