няшный синтаксис для возвращаемого массива C++/CLI
От: jyuyjiyuijyu  
Дата: 25.12.14 17:55
Оценка:
Всем привет

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

link, filename, image, text = data->Split()


сейчас же такую тошноту приходится писать

auto parts = data->Split()

link = parts[0];
filename = parts[1];
image = parts[2];
text = parts[3];


подскажите как покрасивее записать

спасибо
Re: няшный синтаксис для возвращаемого массива C++/CLI
От: _NN_ www.nemerleweb.com
Дата: 25.12.14 18:04
Оценка:
Здравствуйте, jyuyjiyuijyu, Вы писали:

Шаблоном типа std/boost::tie: http://en.cppreference.com/w/cpp/utility/tuple/tie

Что-то вроде
template<typename T1>
class Tie1
{
public:
 Tie1(T1 t1):t1(t1) {}

 Tie1& operator=(System::Array^ arr)
 {
  if (arr->Length != 1) throw gcnew Exception(); // По желанию можно даже проверять размер массива
  t1 = arr[0];
  return *this;
 }
 
 T1 t1;
}

template<typename T1>
Tie1 clrtie(T t1)
{
  return Tie1<T>(t1);
}

...TieN

При наличии шаблонов с переменным числом параметров легко сделать на любое количество.
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[2]: няшный синтаксис для возвращаемого массива C++/CLI
От: jyuyjiyuijyu  
Дата: 25.12.14 18:38
Оценка:
Здравствуйте, _NN_, Вы писали:

_NN>При наличии шаблонов с переменным числом параметров легко сделать на любое количество.


не компилятор cl 16.0 от vs2010 он шаблоны с переменным числом аргументов не компилирует

простите за мою дремучесть а как пользоваться кодом который вы привели?
покажите примерчик
Re[2]: няшный синтаксис для возвращаемого массива C++/CLI
От: jyuyjiyuijyu  
Дата: 25.12.14 18:44
Оценка:
Здравствуйте, _NN_, Вы писали:

а ссылку посмотрел вроде понял

а есть что то готовое? переменные у меня все String^
или в бусте и std:: только для нативного C++ такое есть?
Re[3]: няшный синтаксис для возвращаемого массива C++/CLI
От: _NN_ www.nemerleweb.com
Дата: 25.12.14 19:18
Оценка:
Здравствуйте, jyuyjiyuijyu, Вы писали:

J>Здравствуйте, _NN_, Вы писали:


J>а ссылку посмотрел вроде понял


J>а есть что то готовое? переменные у меня все String^

J>или в бусте и std:: только для нативного C++ такое есть?

Грубо говоря надо функцию tie для массивов, а не только для кортежей.
Не знаю где такое есть.
Но ведь написать не сложно.
Можно взять Boost.Preprocessor и нагенерировать сколько нужно перегрузок. Ну или скриптом

Пользоваться просто:
string link, filename, image, text;
mytie(link, filename, image, text) = data->Split();


А почему просто не назначить индексам названия ?
const int LINK_INDEX = 0;
const int FILENAME_INDEX = 1;
...

auto s = data->Split();
s[LINK_INDEX]->ToLower();
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[4]: няшный синтаксис для возвращаемого массива C++/CLI
От: jyuyjiyuijyu  
Дата: 25.12.14 19:29
Оценка:
Здравствуйте, _NN_, Вы писали:

_NN>Грубо говоря надо функцию tie для массивов, а не только для кортежей.

_NN>Не знаю где такое есть.
_NN>Но ведь написать не сложно.
_NN>Можно взять Boost.Preprocessor и нагенерировать сколько нужно перегрузок. Ну или скриптом

да у меня сама утилитка то 200 строк, замарачиваться ради разового применения...

_NN>Пользоваться просто:


печалит только то что два раза дублируются имена переменных

_NN>А почему просто не назначить индексам названия ?


да можно и так, я написал комментарий объясняющий формат data
Re[5]: няшный синтаксис для возвращаемого массива C++/CLI
От: _NN_ www.nemerleweb.com
Дата: 25.12.14 19:38
Оценка: 1 (1)
Здравствуйте, jyuyjiyuijyu, Вы писали:

J>Здравствуйте, _NN_, Вы писали:


_NN>>Грубо говоря надо функцию tie для массивов, а не только для кортежей.

_NN>>Не знаю где такое есть.
_NN>>Но ведь написать не сложно.
_NN>>Можно взять Boost.Preprocessor и нагенерировать сколько нужно перегрузок. Ну или скриптом

J>да у меня сама утилитка то 200 строк, замарачиваться ради разового применения...

Ну почему разового.
Потом может и в другой утилите понадобится.

_NN>>Пользоваться просто:


J>печалит только то что два раза дублируются имена переменных

А как по другому ?
В C# 6 вроде как будет решение в виде: out var A , но у нас тут другой язык

Ну если это простая утилита то можно взять Nemerle там вообще все просто можно сделать.
Например:
regexp match(data)
{
| @"(?<line : int>\d+),(?<filename : string>.*),(?<other : string>.*)" =>
   // пользуемся
   Console.WriteLine(line);    Console.WriteLine(filename);    Console.WriteLine(other);
| _ => // Error
}


Или там сопоставление с массивом как F# :
match dataSplit with
  // Сопоставляем массив с паттерном и связываем переменные по индексу
  | [| line ; filename ; other |] ->
http://rsdn.nemerleweb.com
http://nemerleweb.com
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.