有什么方法可以称之为
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 – 通过模板传递函数时的推断返回类型所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)