当前位置:  开发笔记 > 编程语言 > 正文

c ++扣除"非类型指针函数"类模板参数

如何解决《c++扣除"非类型指针函数"类模板参数》经验,为你挑选了1个好方法。

考虑一个模板类,如:

template
class Proxy
{
    void run()
    {
        ReturnType ret = Fn();
        // ... do something ...
    }
};

// and a functions
int fn1() { return 5; }
float fn2() { return 5; }

这可以通过使用以下方式实例化:

Proxy p1;

但明确声明返回值类型似乎是不必要的.我想要实现的是:

 someProxyInstantation<&fn1> p1;
 someProxyInstantation<&fn2> p2;

不幸的是,我没有C++预期,这似乎是语言(至少对我来说)一个隐蔽的角落.

如果我可以从函数指针其类型获得 - 这样的:性病:: TR1 ::的result_of <&FN> :: //类型错误1错误C2923: '的std :: TR1 ::的result_of':"FN1 '不是参数'_Fty'的有效模板类型参数

错误是有道理的,因为参数根本不是"类型"

C++ 0x具有decltype(&fn1),但距今已有数年.

在C++ 03(+ tr1)中执行此操作的任何方法?

限制: - 我不想传递仿函数,f1和f2必须保留具有返回值的全局函数(不能将其移动到参数).)



1> Johannes Sch..:

这在C++ 03中是不可能的.如果要将函数指针作为非类型参数传递,则编译器必须知道参数的类型.所以你必须提供缺失的部分(在这种情况下,返回类型).您可以在运行时为代理提供函数指针作为值,并为其提供其类型作为唯一参数.那么你可以为你编写一个生成函数来完成这项工作:

template
Proxy make_proxy(T t) { return Proxy(t); }

遗憾的是,在当前的C++中,你仍然必须给它类型以便分配给一个自动变量:

Proxy p = make_proxy(&fn1);

你还不能用auto p = make_proxy(&fn1);.请注意,如果要在左侧使用函数类型,则必须更改生成器函数以提供不是函数指针类型:

template
Proxy::type> make_proxy(T t) { 
    return Proxy::type>(t); 
}

现在你可以做到

Proxy p = make_proxy(&fn1);

使用代理,你现在可以做到

doSomething(make_proxy(&fn1));

如果doSomething是模板化的或其他多态的,它不需要你知道函数的确切类型.

推荐阅读
ar_wen2402851455
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有