2
有沒有辦法重寫curry
模板類的定義,所以main
接受curry<addtogether>
而不是當前的curry<int,int,int,addtogether>
?具有函數指針參數的模板類
#include<iostream>
int addtogether(int x,int y){
return(x+y);};
template<class T,class U,class V,T(*F)(U,V)>
class curry{
private:
const U y;
public:
curry(U x):y(x){};
T operator()(V v){return(F(y,v));};
};
int main(){
{using namespace std;
cout<<curry<int,int,int,addtogether>(1)(1);}
};
如addtogether
是在編譯時已知這應該是可行的。我剛剛沒有看到許多帶有函數指針的模板。大多數形式是int(*f)(int,int)
,它不夠多態。我正在尋找一個模板定義,它將接受帶有兩個參數的任何函數指針。
謝謝!
編輯:如果我要問的確是不可能的,我認爲以下解決方法的:
#include<iostream>
class addtogether{
public:
typedef int v1;
typedef int v2;
typedef int v0;
int operator()(int x,int y){
return(x+y);};
};
template<class F>
class curry{
public:
typedef typename F::v2 v1;
typedef typename F::v0 v0;
const typename F::v1 y;
curry(const typename F::v1 x):y(x){};
v0 operator()(const v1 v){return(F()(y,v));};
};
int main(){
{using namespace std;
cout<<curry<addtogether>(1)(1);}
};
我可以看看甚至一個類型列表替換類型佔位符v0
v1
v2
。 的東西,我想反正分享...
不作爲類(模板非類型參數,其類型被推斷相對經常被請求)。但是你可以使用一個函數模板,並將函數指針作爲運行時參數傳遞(依靠編譯器優化來移除該間接尋址)或將其包裝在一個lambda中。 – dyp 2014-11-21 23:35:49
相關:http://stackoverflow.com/q/26655685 – dyp 2014-11-21 23:36:53
Duplicate:http://stackoverflow.com/q/19857444 http://stackoverflow.com/q/14710842 http://stackoverflow.com/q/15983802 (還有更多) – dyp 2014-11-21 23:37:52