Объявление сложного аргумента - PullRequest
3 голосов
/ 23 июля 2010

Чтобы сделать мой код более кратким, могу ли я сделать что-то вроде

int f(int const x, y, z), g(int const x, y, z);

для объявления функций f и g, каждый из которых принимает три аргумента int const?

Редактировать : Возможно, вот лучший пример:

int f(int const a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z);

Как это не будет более кратким и читабельным, чем помещать int const перед каждой буквой?

Ответы [ 6 ]

4 голосов
/ 23 июля 2010

Для кода C, если вы действительно настаиваете на нем, вы можете использовать заголовки функций старого стиля (K & R):

typedef int const cint;

int f(a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z)
 cint a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z;
{
    // function body here
}

Обратите внимание, что я не , рекомендую это -- и C ++ в любом случае не поддерживает это, поэтому единственный способ использовать его - это скомпилировать саму функцию в C и включить объявление extern "C" для доступа к ней из C ++.

также отметьте, однако, что вся идея кажется мне глупой в любом случае.Во-первых, функция, которая имеет достаточно параметров, чтобы ее стоило рассмотреть, в основном гарантированно будет катастрофой.Во-вторых, верхний уровень const (т. Е. Применение к самому параметру, а не к тому, на что он указывает или на что он ссылается) совершенно бессмысленен, и (ИМО) в любом случае паршивая идея.

2 голосов
/ 23 июля 2010

Используя препроцессор Boost и учитывая, что вы не хотите описывать аргументы функции один за другим (но не в этом суть вашего вопроса), вы можете использовать следующий прием:

#include <boost/preprocessor/repetition/enum_params.hpp>

int f( BOOST_PP_ENUM_PARAMS(26, int const arg) );

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

1 голос
/ 23 июля 2010

Если вы берете столько параметров одного типа, самое время проснуться и взять std :: / std :: tr1 :: / boost :: array<int, count> const&. Вот для чего предназначены массивы.

0 голосов
/ 23 июля 2010

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

Сказав, что в некоторых случаях правильным решением может бытьиспользовать функции с переменным числом, так что вы можете сделать:

int f(const int arg1, ...)
0 голосов
/ 23 июля 2010

Насколько мне известно, нет. Я думаю, что это сделает ваш код более «сжатым» в том же смысле, что и удаление комментариев и пробелов. Это будет выглядеть короче, но будет гораздо менее читабельным. Мне нравится тот факт, что каждое объявление функции должно быть очень явным и индивидуальным в C ++ (хотя я никогда не сталкивался с языком, который позволял бы вам объявлять несколько функций). Короче говоря, нет.

0 голосов
/ 23 июля 2010

Нет :)

Кроме того, некоторые могут вас обидеть за то, что вы делаете это, даже если бы это было возможно.

С другой стороны, C ++ не известен своей краткостью.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...