c – 通过模板传递函数时的推断返回类型

c – 通过模板传递函数时的推断返回类型,第1张

概述我的问题是让编译器根据模板传递函数的返回类型推断函数的返回类型. 有什么方法可以称之为 foo<bar>(7.3) 代替 foo<double, int, bar>(7.3) 在这个例子中: #include <cstdio>template <class T, class V, V (*func)(T)>V foo(T t) { return func(t); }int bar(dou 我的问题是让编译器根据模板传递的函数的返回类型推断函数的返回类型.

有什么方法可以称之为

foo<bar>(7.3)

代替

foo<double,int,bar>(7.3)

在这个例子中:

#include <cstdio>template <class T,class V,V (*func)(T)>V foo(T t) { return func(t); }int bar(double j)  { return (int)(j + 1); }int main() {  printf("%d\n",foo<double,bar>(7.3));}
解决方法 如果你想把bar作为模板参数,我担心你只能接近这个:

#include <cstdio>template<typename T>struct traits { };template<typename R,typename A>struct traits<R(A)>{    typedef R ret_type;    typedef A arg_type;};template <typename F,F* func>typename traits<F>::ret_type foo(typename traits<F>::arg_type t){ return func(t); }int bar(double j)  { return (int)(j + 1); }int main(){    printf("%d\n",foo<decltype(bar),bar>(7.3));}

如果要避免重复条形图名称,也可以定义宏:

#define FXN_ARG(f) decltype(f),fint main(){    printf("%d\n",foo<FXN_ARG(bar)>(7.3));}

或者,您可以让bar成为函数参数,这可以让您的生活更轻松:

#include <cstdio>template<typename T>struct traits { };template<typename R,typename A>struct traits<R(A)>{    typedef R ret_type;    typedef A arg_type;};template<typename R,typename A>struct traits<R(*)(A)>{    typedef R ret_type;    typedef A arg_type;};template <typename F>typename traits<F>::ret_type foo(F f,typename traits<F>::arg_type t){ return f(t); }int bar(double j)  { return (int)(j + 1); }int main(){    printf("%d\n",foo(bar,7.3));}
总结

以上是内存溢出为你收集整理的c – 通过模板传递函数时的推断返回类型全部内容,希望文章能够帮你解决c – 通过模板传递函数时的推断返回类型所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1226479.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-05
下一篇 2022-06-05

发表评论

登录后才能评论

评论列表(0条)

保存