Ограничение количества аргументов в вариационной функции

Итак, я работал над классом функции, и по умолчанию я могу сделать это, и это работает:

int main(){
    function f("x^2+1");
    cout<<f(3)<<endl;

return 0;
}

"Предположим, правильно включает и пространства имен"

В любом случае, я хотел бы иметь возможность передавать несколько переменных и даже указывать, что это за переменные;

function f("x^2+y^2",x,y); // it doesn't really matter if it's x, 'x', or "x"
cout<<f(3,4)<<endl; // input 3 as x, and 4 as y

Я вполне уверен, что мог бы что-то придумать для конструктора, используя функции с переменными числами, и даже решить правильно, но есть ли способ заставить аргументы operator() принимать ровно 2 значения?

Я просто смотрел на функции с переменным числом аргументов, потому что это действительно первые вещи, которые я видел в C++, которые могут принимать несколько аргументов, поэтому, если это лучше сделать другим способом, я полностью за это.

2 ответа

Вы можете ограничить количество аргументов с помощью static_assert,

template <typename ... Args>
void operator()(Args&&... args)
{
 static_assert(sizeof...(Args) <= 2, "Can deal with at most 2 arguments!");
}

Или вы могли бы использовать enable_if

template <typename ... Args>
auto operator()(Args&&... args) -> std::enable_if_t<sizeof...(Args) <= 2>
{
}
template<class T>
using double_t=double;
template<class...Ts>
using nfun=std::function<double(double_t<Ts>...)>;

template<class...C>
nfun<C...> func(const char*,C...c);

что вернет н-ар std::function равно количеству "переменных" аргументов func,

Так func("x^2+y",'x','y','z') вернусь std::function<double(double,double,double)> В качестве примера.

Другие вопросы по тегам