我设计了一个参数类,它允许我编写如下代码:
//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++,只要你不要忘记使用双括号。即使它比正常功能慢,性能也不会受到太大影响,因此在大多数情况下可以忽略不计。
我可能不是第一个提出这样的解决方案的人,但为什么它不更常见呢?在我编写一个接受它的类之前,我从未见过像上面的语法(我的例子)这样的东西,但对我来说它看起来很完美。