Size: a a a

2020 June 08

D

Danya in pro.cxx
vehlwn
normal mem function не может быть instantiated, потому что это очевидно функция и для нее генерируется код.
Когда класс инстанцирован?
источник

v

vehlwn in pro.cxx
Danya
by default, a member function of a class template is instantiated only if the program uses that member function. For example, this code
// instantiates Blob<int> and the initializer_list<int> constructor
Blob<int> squares = {0,1,2,3,4,5,6,7,8,9};
// instantiates Blob<int>::size() const
for (size_t i = 0; i != squares.size(); ++i)
   squares[i] = i*i; // instantiates Blob<int>::operator[](size_t)

instantiates the Blob<int> class and three of its member functions: operator[], size, and the initializer_list<int> constructor.
If a member function isn’t used, it is not instantiated. The fact that members are instantiated only if we use them lets us instantiate a class with a type that may not meet the requirements for some of the template’s operations (§ 9.2, p. 329).
By default, a member of an instantiated class template is instantiated only if the member is used.
>type that may not meet the requirements

Вот про вектор и говорят.
источник

v

vehlwn in pro.cxx
Danya
Когда класс инстанцирован?
Когда требуется полный тип.
источник

D

Danya in pro.cxx
vehlwn
Когда требуется полный тип.
Что значит полный?
источник

v

vehlwn in pro.cxx
Danya
Что значит полный?
Значит известен размер.
источник

D

Danya in pro.cxx
Вообще не понял как это связано
источник

v

vehlwn in pro.cxx
Danya
Что значит полный?
Когда наследование от класса работает. База обязана быть полным типом.
источник

v

vehlwn in pro.cxx
Danya
Вообще не понял как это связано
А в чем вопрос?
источник

D

Danya in pro.cxx
vehlwn
А в чем вопрос?
Ты сначала говоришь, что non-template member functions of class template инстациируются когда они используются
источник

D

Danya in pro.cxx
А потом говоришь, что когда тип "полный"
источник

v

vehlwn in pro.cxx
Danya
А потом говоришь, что когда тип "полный"
Тип полный когда известны размеры всех дата членов. Функции члены не хранятся в классе.
источник

D

Danya in pro.cxx
Так когда функции инстациируются?!
источник

IA

Igor Akhmetov in pro.cxx
Danya
Так когда функции инстациируются?!
Когда ее нужно проинстанциировать, например вызвать. Это все проверяется за несколько строк, зачем чат этим засорять?
источник

v

vehlwn in pro.cxx
Igor Akhmetov
Когда ее нужно проинстанциировать, например вызвать. Это все проверяется за несколько строк, зачем чат этим засорять?
Действительно. Взял бы вектор и проверил его на мьютексах.
источник

v

vehlwn in pro.cxx
А потом на нормальных копируемых и мувабельных классах и сравнил какие функции вектора вызывать можно, какие нельзя.
источник

D

Danya in pro.cxx
Igor Akhmetov
Когда ее нужно проинстанциировать, например вызвать. Это все проверяется за несколько строк, зачем чат этим засорять?
Потому что @vehlwn сказал что-то очень странное и мне захотелось докопаться до истины
источник

D

Danya in pro.cxx
В любом случае извиняюсь
источник

L

Lee Armstrong in pro.cxx
magras
Ты хочешь запустить два эвентлупа одновременно? Так нельзя. Если ты хочешь, чтобы все работало из одного потока, тебе нужно написать свой цикл, который по-очереди будет дергать два экзекютера. Но на мой взгляд так делать не стоит и лучше каждый экзекютер запускать в своем потоке. А еще лучше оставить только один экзекютер.
мне не нужно 2 эвентлупа, у меня он один, и это libuv, а не io_service, который еще не запилили в linux. Ну и не static_thread_pool, который мне вообще не нужен, ибо однопоток. В прочем я уже решил это дело.

Я просто не понимал как это сделать, ибо sync_wait блокирующий, и run эвентлупа блокирующий.
Пришел к решению cppcoro::when_all(main_task(), loop_run())
cppcoro::task<void> main_task() {
 std::cout << "Главный таск начало" << std::endl;
 co_await sleep_for(1s);
 std::cout << "Главный таск конец" << std::endl;
 co_return;
}

cppcoro::task<void> loop_run() {
 uvw::Loop::getDefault()->run();
 co_return;
}

int main() {
 cppcoro::sync_wait(cppcoro::when_all(main_task(), loop_run()));
}
источник

L

Lee Armstrong in pro.cxx
Который вначале лезет в main_task, а когда тот co_await, то лезет в loop_run и блокируется до конца жизни эвентлупа. А уже оттуда, продолжается main_task
источник

m

magras in pro.cxx
Lee Armstrong
мне не нужно 2 эвентлупа, у меня он один, и это libuv, а не io_service, который еще не запилили в linux. Ну и не static_thread_pool, который мне вообще не нужен, ибо однопоток. В прочем я уже решил это дело.

Я просто не понимал как это сделать, ибо sync_wait блокирующий, и run эвентлупа блокирующий.
Пришел к решению cppcoro::when_all(main_task(), loop_run())
cppcoro::task<void> main_task() {
 std::cout << "Главный таск начало" << std::endl;
 co_await sleep_for(1s);
 std::cout << "Главный таск конец" << std::endl;
 co_return;
}

cppcoro::task<void> loop_run() {
 uvw::Loop::getDefault()->run();
 co_return;
}

int main() {
 cppcoro::sync_wait(cppcoro::when_all(main_task(), loop_run()));
}
На сколько я понимаю, если в main_task будет что-то тяжелое исполняться это заблокирует libuv. Именно поэтому я говорил, о том, что так делать не стоит.
источник