Есть ли способ переписать 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
по списку типов.
Что-то, что я хотел бы поделиться в любом случае …
Есть ли способ переписать
curry
определение класса шаблона такmain
принимаетcurry<addtogether>
вместо текущегоcurry<int,int,int,addtogether>
?
Нет, потому что нетипичный параметр шаблона F
зависит от более ранних параметров шаблона, поэтому не может быть объявлен до них.
Вы действительно нуждаетесь в том, чтобы указатель функции был частью типа, а не хранился как переменная-член curry
? Использование переменной-члена позволит вывести ее в шаблон функции:
template<class T,class U,class V>
class curry{
private:
T (*f)(U,V);
const U y;
public:
curry(T (*f)(U,V), U x): f(f), y(x){};
T operator()(V v){return(f(y,v));};
};
template<class T,class U,class V>
curry<T, U, V>
make_curry(T (*f)(U,V), U u)
{
return curry<T, U, V>(f, u);
}