C++ 函数分辨率

C++ 函数分辨率,c++,templates,function,macros,C++,Templates,Function,Macros,我有很多具有此签名的函数: DoSomething(int x, int y, int z, int t, int u, int p); 它们都具有相同数量的参数和相同类型的参数 我希望能够像这样使用它们: DoSomething(1, 2, 3, 4, 5, 6); 我知道编译器无法区分具有相同签名的函数(它们显然是非法的) 为此,我想将函数的参数包装在逻辑“构造”中。这并不意味着类或结构。例如: DoSomething(Construct1(x, y, z), Construct2(t,

我有很多具有此签名的函数:

DoSomething(int x, int y, int z, int t, int u, int p);
它们都具有相同数量的参数和相同类型的参数

我希望能够像这样使用它们:

DoSomething(1, 2, 3, 4, 5, 6);
我知道编译器无法区分具有相同签名的函数(它们显然是非法的)

为此,我想将函数的参数包装在逻辑“构造”中。这并不意味着类或结构。例如:

DoSomething(Construct1(x, y, z), Construct2(t, u, p));
or
DoSomething(Construct1(x, y), Constrcut2(t, u, p, o));
在这种情况下,我可以区分这两个函数,它们具有相同数量的参数。如果我使用不同构造函数的对象,即使它是constbyref,使用类或结构,构造仍然会被创建。例如:

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);

从而消除了创建对象的需要。我不是在寻找对象解决方案。任何能够扩大这一范围的东西都是受欢迎的。即使它是一个宏。我不是在寻找一个完整的解决方案,但如果你能告诉我我应该读些什么,让我自己来做这件事,那就太好了


提前谢谢

重载基于参数类型而不是参数名称。您不能使用具有相同类型的参数列表的重载函数。

恐怕您必须找到其他路径。编译器会忽略您在函数声明中为参数指定的任何名称,因此,就它而言,您拥有的是:

DoSomething(int, int, int, int, int, int);

DoSomething(int, int, int, int, int, int);
因为这两个函数之间没有区别,所以根本不需要声明两个重载函数——只需声明同一个函数两次。尝试使用相同的签名定义两个函数会违反“一个定义”规则


<>编辑:哦,我想我应该补充一下,没有返回类型,这些都不是可允许的函数声明(不是与手头的问题有关,而是为了防止有人对此做出迂腐的决定),尽管我难以想象C++程序员会做这样的事情。.

通过让Object1和Object2公开底层存储INT,可以避免不必要的拷贝

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;
}
struct Object1{
...
int x;
int-y;
...
}
//
剂量测量(常数对象1和o1、常数对象2和o2)
{
int somethingUseful=o1.x*o2.w-o1.y*o2.z;
}

如果您仍然觉得这种方法不需要复制,请详细说明。

我认为您有一些误解。最明显的是参数的名称很重要。。。就编译器而言,这两个函数声明声明的单个函数不包含6个整数(如果它们不同,请考虑
DoSomething(1,2,3,4,5,6)
DoSomething(1,2,3,4,5,6)DoSomething?)

第二个误解是对象创建必然意味着分配。在您展示的代码中:
DoSomething(Object1(x,y,z),Object2(t,y,u))
有两个对象,但没有一个单独的动态分配(除非您在
Object1
Object2
构造函数中执行它们)


总体上,你应该编写可读代码,只有当强< > < /St>时要慢,然后<强> Prime<强>,并尝试优化瓶颈。

你甚至不能定义C++中的两个相同函数,所以询问编译器如何区分两者,如果假设它们确实存在的话就没有意义了。


然后,您似乎在询问如何在不需要额外分配的情况下传递对象。这是通过const引用完成的,但考虑到您的程序结构还没有固化,即使担心这一点也似乎为时过早。首先编写程序,然后在需要时进行优化。过早优化是万恶之源。

您的参数列表中有两个
y
s。您所说的“我不想从一个有数百万行的文件中读取值”是什么意思?这可能是快速且仍然“干净”的最好方法。其他一切都缺少直接内存操作,即memcopy你可能会考虑不做你的参考文献,尽管(对于这个特殊的情况)。临时表只能绑定到常量引用,而不能绑定到非常量引用。@Rob,是的。。。和否;-)我指的是getter,即int&getX()const