Я разработал класс параметров, который позволяет мне писать такой код:
//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 аргументов, прежде чем он перейдет к выделению кучи, чтобы уменьшить размер каждого отдельного объекта, но это можно легко изменить.
Почему этот синтаксис не используется чаще, перегружая operator,()
для реализации именованных параметров? Это из-за потенциального снижения производительности?
Еще один способ - использовать названную идиому:
object.name("my name").ref(num); //every object method returns a reference to itself, allow object chaining.
Но для меня перегрузка operator,()
выглядит гораздо более "современным" C++, если вы не забываете использовать двойные скобки. Производительность также не сильно страдает, даже если она медленнее, чем обычная функция, поэтому в большинстве случаев ею можно пренебречь.
Я, наверное, не первый, кто придумал подобное решение, но почему оно не встречается чаще? Я никогда не видел ничего похожего на приведенный выше синтаксис (мой пример) до того, как написал класс, который его принимает, но для меня он выглядит идеально.
operator,
обычно плохая идея, потому что она не будет вести себя как обычный оператор,
(похожая логика объясняет, почему не следует перегружатьoperator&&
илиoperator||
). - person Oliver Charlesworth   schedule 06.04.2012<
или>
(классы — это отдельная история, но они должны быть типизированы). Что-то вродеunsigned long & n = param<ref<unsigned long> >()
непонятно. Однако что-то вродеunsigned long n; getParam(n);
, гдеgetParam
является шаблоном<typename T> void getParam(T&)
, гораздо легче читать. - person SigTerm   schedule 06.04.2012#include <boost/parameter.hpp>
- один файл. Кого волнует, что еще включает в себя это? - person ildjarn   schedule 06.04.2012