Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > Эквивалент out keyword в C++


Автор: marcusmae 27.2.2007, 00:59
Всем привет smile

Сабж.

Самое очевидное направление поиска заключается в том, чтобы открыть MSDN на какой-нибудь функции типа TryGetValue(TKey key, out TValue value) и посмотреть, как записывается её C++ -ный прототип. Но что-то я устал и/или ничего не понял : некий OutAttribute, который кажется мало относящимся к out-у.

В общем, подскажите, пожалуйста, как на C++ записать прототип функции, эквивалентная запись которой на C# имеет модификатор out при одном из параметров.

Автор: Mymik 27.2.2007, 08:38
передавать параметр по ссылке... 

Автор: Idsa 27.2.2007, 11:49
Цитата(Mymik @  27.2.2007,  08:38 Найти цитируемый пост)
передавать параметр по ссылке... 

Это аналог ref.
Out же обязывает, чтобы переменной было присвоено значение внутри функции:
Цитата

The out keyword causes arguments to be passed by reference. This is similar to the ref keyword, except that ref requires that the variable be initialized before being passed.


Рефлектор же C# функцию
Код

static void func(out int i)
    {
      i = 0;
    }

преобразовал в C++ вот так:
Код

private: static void __gc* func([System::Runtime::InteropServices::Out] System::Int32 __gc* *i)
{
      i = 0;
}

Автор: marcusmae 27.2.2007, 12:48
Idsa, спасибо, но что-то всё-равно несовсем ясно :

Во-первых, новый синтаксис обязывает ставить крышку вместо __gc* :

Код

bool TryGetValue(int code, [Out] int^ *value)
{
    ...
}


Во-вторых, при такой записи второй параметр имеет тип System.ValueType*, хотя по идее должен был бы быть виден, как out int.

Поясните, плз.

Автор: Idsa 27.2.2007, 12:52
Сам я на MC++ не пишу, так что ничего точного сказать не могу. То, что не согласуется синтаксис, - нормально: это ведь всего лишь рефлектор. Думаю, главное в этом примере - атрибут [Out]. Остальное уже можно приладить smile.

Автор: Любитель 4.3.2007, 01:09
1. Рефлектор даёт код для MC++, а не C++/CLI (хотя поседний поддерживает ужасный старый синтаксис)
2. А варианты:
Код

bool TryGetValue(int code, [Out] int& value)
// ...
bool TryGetValue(int code, [Out] int value)

не прокатят? (сам не пробовал - сейчас негде).

Автор: marcusmae 4.3.2007, 02:42
Господа, Вы будете смеяться, но ответ следующий :

Код

bool TryGetNorm(int code, ref int norm)


эквивалентно

Код

bool TryGetNorm(int code, int %norm)


а

Код

bool TryGetNorm(int code, out int norm)


эквивалентно

Код

bool TryGetNorm(int code, [Out] int %norm)


Знак процента. И долго же я думал smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)