首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带函数指针的模板演绎反转

带函数指针的模板演绎反转
EN

Stack Overflow用户
提问于 2019-01-09 10:37:06
回答 1查看 117关注 0票数 6

我以前的代码在从g++-5迁移到g++-6时失败了;以前可还原的模板不再是可还原的。一个最小的例子是:

代码语言:javascript
复制
#include <math.h>

template<typename T,typename T1>
T apply(T (*func)(T1), const T1 &val)
{
  return func(val);
}

int main(void)
{
  double val1 = 0.5, val2 = apply(ceil,val1);
  return 0;
}

g++-6似乎找不到正确的ceil版本。

代码语言:javascript
复制
foo.cpp: In function ‘int main()’:
foo.cpp:11:44: error: no matching function for call to ‘apply(<unresolved overloaded function type>, double&)’
   double val1 = 0.5, val2 = apply(ceil,val1);
                                        ^
foo.cpp:4:3: note: candidate: template<class T, class T1> T apply(T (*)(T), const T1&)
 T apply(T (*func)(T), const T1 &val)
   ^~~~~
foo.cpp:4:3: note:   template argument deduction/substitution failed:
foo.cpp:11:44: note:   couldn't deduce template parameter ‘T’
   double val1 = 0.5, val2 = apply(ceil,val1);

g++-5没有问题,按预期工作.在使用g++ 8的编译器资源管理器( Compiler )时,我还看到了从clang-3.3 (编译)到clang-3.4 (不编译)的反转。

考虑到代码仍然不能工作,即使在当前的g++中,我也认为错误是我的错。我做错了什么,该如何解决呢?

EN

回答 1

Stack Overflow用户

发布于 2019-01-09 11:28:27

如果您正在使用(或计划使用) C++17,您应该知道有一个更健壮的库函数正在执行您想要做的事情:std::调用

使用它,您的示例可以简化为:

代码语言:javascript
复制
#include <cmath>
#include <functional>

int main(void)
{
  double val1 = 0.5, val2 = std::invoke(ceil,val1);
  return 0;
}

有趣的是,使用手工构建的apply和库std::invoke,如果编写std::invoke(std::ceil, val1),代码将失败。这需要进一步调查..。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54108162

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档