Я разработал класс параметров, который позволяет мне писать такой код:
//define parameter
typedef basic_config_param<std::string> name;
void test(config_param param) {
if(param.has<name>()) { //by name
cout << "Your name is: " << param.get<name>() << endl;
}
unsigned long & n = param<ref<unsigned long> >(); //by type
if(param.get<value<bool> >(true)) { //return true if not found
++n;
}
}
unsigned long num = 0;
test(( name("Special :-)"), ref<unsigned long>(num) )); //easy to add a number parameter
cout << "Number is: " << num; //prints 1
Производительность класса довольно высока: все просто ссылку в стеке. И чтобы сохранить всю информацию, я использую внутренний буфер до 5 аргументов, прежде чем он перейдет к выделению кучи, чтобы уменьшить размер каждого отдельного объекта, но это можно легко изменить.
Почему бы и нет этот синтаксис используется чаще, перегружая оператор, ()
для реализации именованных параметров? Это из-за потенциального снижения производительности?
Еще один способ - использовать именованную идиому:
object.name("my name").ref(num); //every object method returns a reference to itself, allow object chaining.
Но для мне, перегрузка оператора , ()
выглядит гораздо более "современным" C++, если вы не забываете использовать двойные скобки Производительность также не сильно страдает, даже если она медленнее, чем обычная функция , поэтому в большинстве случаев им можно пренебречь.
Вероятно, я не первый, кто придумал подобное решение, но почему оно не встречается чаще? Я никогда не видел ничего похожего на приведенный выше синтаксис (мой пример) до того, как написал класс, который его принимает, но для меня он выглядит идеально.