Просто для полноты картины, можно использовать именованные аргументы, когда ваш вызов становится.
void allocate_things(num_buffers=20, pages_per_buffer=40, default_value=20);
// or equivalently
void allocate_things(pages_per_buffer=40, default_value=20, num_buffers=20);
Тем не менее, с текущей C++ это требует совсем немного кода, который будет реализован (в файле заголовка объявляющего allocate_things()
, который также должен объявить соответствующие внешние объекты num_buffers
и т.д. обеспечивая operator=
, который возвращает уникальный подходящий объект).
---------- Рабочий пример (для Sergej)
#include <iostream>
struct a_t { int x=0; a_t(int i): x(i){} };
struct b_t { int x=0; b_t(int i): x(i){} };
struct c_t { int x=0; c_t(int i): x(i){} };
// implement using all possible permutations of the arguments.
// for many more argumentes better use a varidadic template.
void func(a_t a, b_t b, c_t c)
{ std::cout<<"a="<<a.x<<" b="<<b.x<<" c="<<c.x<<std::endl; }
inline void func(b_t b, c_t c, a_t a) { func(a,b,c); }
inline void func(c_t c, a_t a, b_t b) { func(a,b,c); }
inline void func(a_t a, c_t c, b_t b) { func(a,b,c); }
inline void func(c_t c, b_t b, a_t a) { func(a,b,c); }
inline void func(b_t b, a_t a, c_t c) { func(a,b,c); }
struct make_a { a_t operator=(int i) { return {i}; } } a;
struct make_b { b_t operator=(int i) { return {i}; } } b;
struct make_c { c_t operator=(int i) { return {i}; } } c;
int main()
{
func(b=2, c=10, a=42);
}
Компилятора может помочь вы в большинстве случаев. В противном случае это ваши обязанности (программист). –
Не так ли легко в C++, используя определенные типы? – alk
Если параметры организованы логически (a, b.c, d, e ...), их легко запомнить все в правильном порядке. –