我有很多这个签名的功能:
DoSomething(int x, int y, int z, int t, int u, int p);
它们都具有相同数量的参数和相同类型的参数。
我希望能够像这样使用它们:
DoSomething(1, 2, 3, 4, 5, 6);
我知道编译器无法区分相同签名的功能(它们是完全非法的)。
为此,我想在逻辑“Constructs”中包装函数的参数。这并不意味着类或结构。例如:
DoSomething(Construct1(x, y, z), Construct2(t, u, p));
or
DoSomething(Construct1(x, y), Constrcut2(t, u, p, o));
在这种情况下,我可以区分这两个函数,它们具有相同数量的参数。如果我使用具有不同构造函数的对象,即使它是由ref构造的const,使用类或结构,仍然会创建构造。例如:
DoSomething(const Construct1& constr1, const Construct2& constr2)
{
constr1.x + constr2.t
}
DoSomething(Construct1(1, 2, 3), Construct2(4, 5, 6));
在这种情况下,都会创建Construct1和Construct2。
我想要的是:
DoSomething(Construct1(x, y, z), Construct2(t, u, p));
or
DoSomething(Construct1(x, y), Constrcut2(t, u, p, o));
在编译时扩展为:
DoSomething(int x, int y, int z, int t, int u, int p);
因此消除了对象创建的需要。我不是在寻找对象解决方案。任何可以扩展这个的东西都是受欢迎的。即使它是一个宏。我不是在寻找一个完整的解决方案,但是如果你能指出我应该阅读的内容以便自己做到这一点,那么这非常受欢迎。
提前致谢。
答案 0 :(得分:4)
重载基于参数 types 而不是参数 names 。您不能重载具有相同类型的参数列表的函数。
答案 1 :(得分:3)
我认为你有一些误解。最明显的是参数的名称很重要...它们没有,就编译器而言,这两个函数声明声明一个函数需要6个整数(考虑一下,如果它们不同,那么{{ 1}}做什么?)
第二个误解是对象创建必然意味着分配。在您提供的代码中:DoSomething( 1, 2, 3, 4, 5, 6 )
有两个对象但没有一个动态分配(除非您在DoSomething( Object1(x,y,z), Object2(t,y,u) )
或Object1
构造函数中执行这些操作)。
总的来说,您应该编写可读的代码,并且只有当证明缓慢,然后个人资料并尝试优化瓶颈。
答案 2 :(得分:1)
我担心你必须找到其他路线。编译器会忽略您在函数声明中为参数赋予的任何名称,因此只要它关心,您拥有的是:
DoSomething(int, int, int, int, int, int);
DoSomething(int, int, int, int, int, int);
由于它们之间没有区别,所以你根本没有声明两个重载函数 - 你只是声明两次相同的函数。尝试使用相同的签名定义两个函数会违反单一定义规则。
编辑:哦,我想我应该在没有返回类型的情况下添加它们,这些也不是允许的函数声明(不是它与手头的问题有关,但是以防万一有人决定对此嗤之以鼻 - 虽然我很难想象C ++程序员会做那样的事情。)
答案 3 :(得分:1)
您可以通过让Object1和Object2公开底层存储空间来避免不需要的副本
struct Object1 {
...
int x;
int y;
...
}
//<--- passed by reference, no copy happens --->
DoSomething( const Object1& o1, const Object2& o2 )
{
int somethingUseful = o1.x * o2.w - o1.y * o2.z;
}
请详细说明您是否仍然觉得这种方法发生的副本并非真正需要。
答案 4 :(得分:0)
你甚至无法在C ++中定义两个相同的函数,因此询问编译器如何在假设它们 存在的情况下区分这两个函数是没有意义的。
然后,您似乎在询问如何在不需要额外分配的情况下传递对象。这是通过const引用来完成的,但即使担心这一点似乎还为时过早,因为你甚至还没有使程序的结构固化。首先编写程序,然后然后优化,如果需要的话。过早优化是万恶之源。