ilostmyid2 Ответов: 2

960716-как относиться к пустоте как к аргументу?


В следующем коде:
void f()
{
    int a=2, b=3;
    M(a+1);
    M(swap(a,b));
}

Я ищу такой выход:
a+1 --> 3
swap (a, b) --> x
Предположим, что swap - это функция, которая меняет местами значения a и b и возвращает void.
Как написать макрос M?
Другими словами, Мне нужен результат, если void, то он не выводит ничего, кроме x во втором столбце, А если он не void, то показывает результат.

Что я уже пробовал:

шаблонные функции и вариадические макросы.

Richard MacCutchan

Ваша функция не принимает никаких параметров и не возвращает результат, поэтому она действительно не служит никакой цели. Кроме того, ваш вопрос невозможно понять.

ilostmyid2

1. Многие программы написаны с void main(void), которые делают много вещей!
2. вопрос ясен. я описал это мельком.

PIEBALDconsult

2. Нет, не ясно. Пожалуйста, используйте "улучшить вопрос", чтобы добавить детали и контекст.

Richard MacCutchan

1. это верно, но они этого не делают и не могут вернуть результат.
2. - Другими словами, Мне нужен результат, если void, то он не выводит ничего, кроме x во втором столбце, А если он не void, то показывает результат."- Извините, но я понятия не имею, что это должно означать.

PIEBALDconsult

Ах, значит, макрос M должен выводить значение своего аргумента? Итак, что-то вроде
# определить M (x) printf ( x )
И это работает для аргумента a+1,но не для обмена аргументами(a , b), правильно ли я это понимаю?

ilostmyid2

да. я сказал, что все ясно.

PIEBALDconsult

Но это не так.

2 Ответов

Рейтинг:
8

ilostmyid2

class variant
{
	char d_var[80];

public:
	variant() { d_var[0] = 0; }
	variant(int a) { sprintf(d_var, "%d", a); }
	variant(LPCSTR var) { strcpy(d_var, var); }

	operator LPCSTR() const { return d_var; }
	//string operator ,(const string &arg) const { return d_var; }
};

string operator ,(const variant &var, const string &arg) { return var; }

void void_func() {}

struct PrintHelper
{
	operator string() const { return "void"; }
} printHelper;

void print(LPCSTR title, const string &result)
{
	printf("expression \"%s\" evaluates to \"%s\"\n", title, result.c_str());
}

#define M(expr) print(#expr, (expr, printHelper))

void f9()
{
	int a=2, b=3;
	M(10);
	M(a+1);
	M(void_func());
	M(swap(a,b));
}

Он выводит на:
expression "10" evaluates to "10"
expression "a+1" evaluates to "3"
expression "void_func()" evaluates to "void"
expression "swap(a,b)" evaluates to "void"

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


Рейтинг:
2

Patrice T

Цитата:
как относиться к пустоте как к аргументу?

Мой короткий ответ: нет!
В принципе, на языке C/C++ "void" означает отсутствие значения.
Цитата:
Предположим, что swap - это функция, которая меняет местами значения a и b и возвращает void.

В вашей ситуации "void" используется для того, чтобы сказать, что фрагмент кода не возвращает никакого значения.
Цитата:
1. Многие программы написаны с void main(void), которые делают много вещей!

Первый void означать то main не возвращайте никакого значения вызывающему абоненту, а вызывающий-это ОС, и ему наплевать на возвращаемое значение.
Второй void означать то main не принимайте никаких значений от вызывающего абонента.
Тип пустоты - Википедия[^]