Ограничение количества аргументов в вариационной функции
Итак, я работал над классом функции, и по умолчанию я могу сделать это, и это работает:
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)>
В качестве примера.