Разрешение функции - PullRequest
       29

Разрешение функции

0 голосов
/ 24 октября 2011

У меня много функций с этой подписью:

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

В этом случае я могу различить две функции, и они имеют одинаковое количество параметров.Если я использую объекты с разными конструкторами, даже если это const от ref, используя класс или структуру, Construct все еще создается.Например:

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

, что исключает необходимость создания объекта.Я не ищу объектное решение.Все, что может расширить это, можно только приветствовать.Даже если это макрос.Я не ищу полное решение, но если вы можете указать мне на то, что я должен прочитать, чтобы сделать это сам, то это более чем приветствуется.

Заранее спасибо.

Ответы [ 5 ]

4 голосов
/ 24 октября 2011

Перегрузка основана на параметре types , а не на параметре names . Вы не можете иметь перегруженные функции, у которых есть списки параметров с одинаковыми типами.

3 голосов
/ 24 октября 2011

Я думаю, у вас есть несколько заблуждений.Наиболее очевидным является то, что имена параметров имеют значение ... они не имеют значения, поскольку для компилятора эти два объявления функций объявляют одну функцию, которая принимает 6 целых чисел (подумайте, если бы они были разными, что бы DoSomething( 1, 2, 3, 4, 5, 6 ) do?)

Второе заблуждение состоит в том, что создание объекта обязательно означает выделение.В представленном вами коде: DoSomething( Object1(x,y,z), Object2(t,y,u) ) есть два объекта, но не одно динамическое выделение (если вы не делаете их внутри Object1 или Object2 конструкторов).

В целом вы должны написать код, который будет читаемым,и только если это окажется медленным, тогда профиль и попытаться оптимизировать узкие места.

1 голос
/ 24 октября 2011

Вы можете избежать ненужных копий, если 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;
}

Пожалуйста, уточните, если вы все еще чувствуете, что с таким подходом происходят копии, которые на самом деле не нужны.

1 голос
/ 24 октября 2011

Боюсь, вам придется найти какой-нибудь другой маршрут. Компилятор игнорирует любые имена, которые вы присваиваете параметрам в объявлении функции, поэтому, насколько это важно, у вас есть:

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

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

Поскольку между ними нет никакой разницы, вы вообще не объявляете две перегруженные функции - вы просто объявляете одну и ту же функцию дважды. Попытка определить две функции с одинаковой сигнатурой нарушает правило одного определения.

Edit: О, я полагаю, я должен добавить, что без возвращаемого типа, это также недопустимые объявления функций (не то, что это связано с рассматриваемым вопросом, но на тот случай, если кто-то решит заняться этим - хотя я с трудом могу себе представить, что программист на C ++ делает что-то подобное).

0 голосов
/ 25 октября 2011

Вы даже не можете определить две идентичные функции в C ++, поэтому спрашивать, как компилятор может различать эти две функции, если гипотетически они существуют , существует , бессмысленно.

Тогда вы, похоже, спрашиваете, какпередавать объекты без дополнительных выделений.Это делается с помощью константных ссылок, но даже беспокоиться об этом кажется преждевременным, если учесть, что структура вашей программы еще не укреплена.Сначала напишите вашу программу, затем и только потом оптимизируйте , если это необходимо.Преждевременная оптимизация - корень всего зла.

...