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当然,关于o1和o2,您完全正确,因此感谢您的澄清!基本上,对于这个用例,我只需将Object1和Object2中的变量声明为public并直接处理它们,从而避免DoSomething()中的任何整数复制操作。好的一点是,只需删除getter并明确表示您可以从objectsGotcha中复制内容。这很有道理。谢谢您的回答。@user985611:您知道创建这些对象的成本几乎为零,并且您正在寻找一种方法来强制更改代码,使其更难理解,只是为了避免不存在的问题?我不需要任何其他人来理解代码。除非你有一个解决方案,请不要仅仅为了发布而发布。如果我提出要求,这意味着我需要它。你提出的要求很难实现,你将产生的代码也很难维护。您在问题中提供的原因要么不清楚,要么根本不正确:“为了避免不必要的内存分配”——这不会发生。“使用x、y、z、t、y、u而不必经过Object1和Object2”-在典型情况下,编译器会在后台完全做到这一点!编译器足够聪明,可以优化代码。然而,您提到了文件中的一些行,您是否试图以某种方式序列化文件中的这些函数(或函数调用)或其他内容?这些原因只是示例。我只是想知道如何让编译器在不使用类或任何东西的情况下区分两个相同的函数