Шаблонный класс с параметром указателя на функцию

Есть ли способ переписать 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 по списку типов.
Что-то, что я хотел бы поделиться в любом случае …

2

Решение

Есть ли способ переписать 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);
}
2

Другие решения


По вопросам рекламы [email protected]