Russian Qt Forum
Ноябрь 23, 2024, 04:29 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: 1 ... 10 11 [12] 13 14 ... 16   Вниз
  Печать  
Автор Тема: Приватные методы  (Прочитано 102296 раз)
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #165 : Октябрь 02, 2015, 10:20 »

Хотелось бы увидеть пример где выгоды (весьма) ощутимы. Спасибо

QVariantList Улыбающийся

"все уже придумано до нас"
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #166 : Октябрь 02, 2015, 10:57 »


Код:
// --- отправка сообщений подписчикам
// через систему сообщений
SendMessage(10)("hello")("world")();


Ну вот у меня сразу вопросы - что такое 10? Что такое пустые скобочки в конце? Могу ли я их не писать?  Не заглядывая под капот SendMessage, на это ответить нельзя. А код должен быть читаемым, в первую очередь, так как пишется он 1 раз, а читается потом много и разными людьми.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #167 : Октябрь 02, 2015, 11:44 »

и не нужно изобретать на каждый чих отдельные структуры,
наследовать их от каких то интерфейсов, и тп.
Идея понятна, спасибо за примеры. Но вот.. как же без структур? Хорошо, принимающий получил это чудо, что он будет с ним делать не зная типы? И еще
Цитировать
SendMessage(10)("hello")("world")();
Шо это за козырный сынтаксыс? Во что это отливается в asm? Это аргументы подаваемые на стек или как? Могу ли это я как-то в языке юзать  "просто так", без туплей? Спасибо
Записан
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2095



Просмотр профиля
« Ответ #168 : Октябрь 02, 2015, 12:02 »

Цитировать
Шо это за козырный сынтаксыс? Во что это отливается в asm? Это аргументы подаваемые на стек или как? Могу ли это я как-то в языке юзать  "просто так", без туплей? Спасибо
Приехали) Вот оно, плоды "светлого будущего" и творческого подхода)

Это ж оператор()
Код
C++ (Qt)
struct SendMessage
{
   template <class T>
   SendMessage & operator()(const T & x)
   {
       std::cout << x << std::endl;
       return *this;
   }
};
 
SendMessage m;
 
   m(10)("hello")(3.1415);
 
Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #169 : Октябрь 02, 2015, 12:07 »

Это ж оператор()
Вы сейчас разрушили всю магию... Улыбающийся
Записан
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2095



Просмотр профиля
« Ответ #170 : Октябрь 02, 2015, 12:14 »

Вы сейчас разрушили всю магию... Улыбающийся
Смеющийся
Не удержался, простите)
Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #171 : Октябрь 02, 2015, 12:20 »

Это ж оператор()
Во блин, и так можно...

Тогда переформулирую первый вопрос. А как это "передать"? Т.е. хорошо, оператор получил на вход очередной "T", и что дальше?
« Последнее редактирование: Октябрь 02, 2015, 12:25 от Igors » Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #172 : Октябрь 02, 2015, 14:13 »

Тогда переформулирую первый вопрос. А как это "передать"? Т.е. хорошо, оператор получил на вход очередной "T", и что дальше?

Код
C++ (Qt)
struct Message
{
template <class T>
Message &operator()( const T &x )
{
m_values.push_back( x );
return *this;
}
 
void operator()()
{
std::cout << "Sending message: ";
for( auto &val : m_values )
std::cout << val << ' ';
std::cout << std::endl;
}
 
typedef boost::variant<int, std::string> Value;
std::deque<Value> m_values;
};
 
template <class T>
Message SendMessage( const T &x )
{
Message msg;
msg( x );
return msg;
}
 
int main( int argc, char *argv[] )
{
SendMessage( 10 )( "Test string" )( "asdasd" )();
return 0;
}
 

А можно не делать специальный оператор () для отправки, а выполнять ее в деструкторе Message.
« Последнее редактирование: Октябрь 02, 2015, 14:18 от Old » Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #173 : Октябрь 02, 2015, 14:26 »

Тогда переформулирую первый вопрос. А как это "передать"? Т.е. хорошо, оператор получил на вход очередной "T", и что дальше?

Повторюсь, пожалуй... Аналог QVariantList. Ну или QVariantMap, если с ключами Улыбающийся
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #174 : Октябрь 02, 2015, 14:32 »

Повторюсь, пожалуй... Аналог QVariantList. Ну или QVariantMap, если с ключами Улыбающийся
Но есть момент. Улыбающийся
Ни первый, ни второй не сможет контролировать количество и типы аргументов, а tuple сможет. Улыбающийся
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #175 : Октябрь 02, 2015, 14:39 »

Повторюсь, пожалуй... Аналог QVariantList. Ну или QVariantMap, если с ключами Улыбающийся
Ну это банально, да и расходно
Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #176 : Октябрь 02, 2015, 16:15 »

Ни первый, ни второй не сможет контролировать количество и типы аргументов, а tuple сможет. Улыбающийся

В смысле?? QVariantList это по сути QList, количество доступно через count(). А каждый QVariant можно опросить, какого он типа, через QVariant::type().
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #177 : Октябрь 02, 2015, 16:21 »

В смысле?? QVariantList это по сути QList, количество доступно через count(). А каждый QVariant можно опросить, какого он типа, через QVariant::type().
Это понятно.
Я про то, что если определили кортеж:
Код
C++ (Qt)
tuple<int, string, string>
то запихнуть туда три числа не получиться и 8 строк не получится.
В отличие от... Улыбающийся
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #178 : Октябрь 02, 2015, 16:22 »

В смысле?? QVariantList это по сути QList, количество доступно через count(). А каждый QVariant можно опросить, какого он типа, через QVariant::type().
Вариант (в любом виде) - самый гнусный тип (или паттерн, хз), по сути расписались в собственном бессилии со слабой надеждой разобраться в runtime
Записан
_Bers
Бывалый
*****
Offline Offline

Сообщений: 486


Просмотр профиля
« Ответ #179 : Октябрь 03, 2015, 00:12 »


Код:
// --- отправка сообщений подписчикам
// через систему сообщений
SendMessage(10)("hello")("world")();


Ну вот у меня сразу вопросы - что такое 10? Что такое пустые скобочки в конце? Могу ли я их не писать?  Не заглядывая под капот SendMessage, на это ответить нельзя.

10 - это такая циферка, которая имеет тип int,
и является частью сообщения состоящего из трех полей.

пустые скобки в конце детонируют отправку сообщения.

что бы понять, как пользоваться SendMessage
достаточно 5 минут времени на чтение документации,
которая представляет собой пример-иллюстрацию хэлловорлда.

А код должен быть читаемым, в первую очередь, так как пишется он 1 раз, а читается потом много и разными людьми.

верно. именно поэтому и был создан этот механизм.

классическая альтернатива (по школе банды четырех):
нельзя просто так взять и отправить тип int
Код:
SendMessage(10)();

нужно сначала создать наследника, который унаследуется от некоторого интерфейса:

Код:
struct MessageInt : IMessage
{
    MessageInt(const int v):value(v){}
    int value;
};

...

SendMessage( MessageInt (10)  );

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

и что самое хреновое:

Код:
void Reader::ReadMessage( const IMessage& msg )
{
    // привет, рантайм!!!
    auto& concreteMessage = dynamic_cast<MessageInt&>(msg);
}

классическая школа в духе банды четырех в этом смысле - унылое Г.
тормозной рантайм с тормознутой проверкой на ошибки только в рантайме.

кода придется вручную фигачить немерянно.
а работать это будет неэффективно.
Записан
Страниц: 1 ... 10 11 [12] 13 14 ... 16   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.109 секунд. Запросов: 23.