【发布时间】:2012-04-19 17:26:07
【问题描述】:
我设计了一个参数类,它允许我编写如下代码:
//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||)。 -
是的,我的意思是,我看到这里有很多复杂性,但几乎没有收获。记住;复杂性要花钱。人们需要时间来了解正在发生的事情($$$),并且需要时间来维护/修复与之相关的错误(再次,$$$)。老实说,如果我在我工作的代码中看到类似的东西,我将不得不与实现它的人聊天。这对我来说有点像没有经验的开发者会想出的东西。
-
这个功能已经在 boost 中使用多年了:boost.org/doc/libs/1_49_0/libs/parameter/doc/html/index.html 不知道实际使用了多少
标签: c++ named-parameters