LINUX.ORG.RU

7
Всего сообщений: 43

с++ и зависимые типы

а вот так можно ?

std::cin>>(int)x;
std::cout << workingFunction<x>() << std::endl;

monk

 ,

AndreyKl ()

с++, сгенерировать инстансы шаблона?

Например, есть шаблонный класс, например

template<int nd>
class foo_t{
	...
};
И холдер, который может держать несолько инстансов, например через
class foo_holder : public std::variant<foo_t<1>, foo_t<2>>{
	...
	template<int nd>
	operator foo_t<nd>& () const {
		return std::get<foo_t<nd>>(*this);
	}
};
Ну или через union.

И, например, есть шаблонная функция, принимающая этот шаблонный класс и в то же время параметризуемая ещё какими-то параметрами

template<int nd, int flag>
void proc_foo_f(foo_t<nd>&)
Хочется какого-то аналога виртуального метода так что бы была одна универсальная функция, принимающая холдер класса, параметры и вызывающая внутри себя уже конкретные инстансы шаблона. Т.е. вручную по смыслу это было-бы что-то вроде
void proc_foo(foo_holder& foo, int a, int b){
	int nd=foo.index()+1
	switch (nd) {
		case 1: switch (flag) {
			case FLAG1: return proc_foo_f<1,1>(foo); 
			case FLAG2: return proc_foo_f<1,2>(foo);
 			...
		}
		case 2: switch (flag) {
			case FLAG1: return proc_foo_f<2,1>(foo); 
			case FLAG2: return proc_foo_f<2,2>(foo); 
 			...
		}
	}
}
Где число комбинаций nd и флагов конечно, поэтому, в принципе, всё это можно занести в таблицу.

Думал сделать это ввиде виртуального класса-функтора, но как-то это тоже коряво, тем более для каждого инстанса его надо не только писать, но ещё и называть как-то. Как такую семантику делать правильно?

 , ,

thunar ()

protobuf одинаковое поле для разных протоколов

Нужно передать сообщение полученое по одному протоколу в виде похожего сообщения по другому протоколу.

один протокол, пусть p1

message A { X x; ...}
другой протокол, пусть p2
message B {X x; ...}
message X совпадают в протоколах и я слежу за этим (макросы как порекомендовали).

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

p1:A a1 = someProcedure();
p2::X *x2 = new p2::X();
std::string tmp;
a.x().SerializeToString(&tmp);
x2->ParseFromString(tmp);
a1->set_allocated_x(x2); // a1 типа p1:A

Все работает конечно. Но, блин, чем то напрягает это решение ... как то коряво )

P.S. я правильно понимаю, что утечки тут нет (x2 = new), т.к. протобуф сам освободит память?

 ,

cvprog ()

Как правильно органозовать p2p чат?

Хочу сделать p2p чатик без использования сервера, в интернете много общей информации по одноранговым сетям, но подробностей не так много. Где можно подробно про это почитать? На данный момент больше всего интересует как можно узнать адрес хотя бы одного клиента находящегося в сети. Например когда клиент подключаться к сети ему же нужно связаться хотя бы одного другого клиента. Получается в любом случае должен быть хотя бы какой то известный изначально узел, который может передать такую информацию. Возможно существуют какие то сервисы, которые по REST API например, могут предоставить информацию о других клиентах в сети. Не хотелось бы делать велосипед, если есть готовые варианты с которыми можно потренироваться работать.

 , ,

Mars36 ()

Налетай, не ленись - интерпретатор плюсов

сетевые раскопки привели к интересному :

http://home.mweb.co.za/sd/sdonovan/underc.html

старинный интерпретатор (!!) С++. С эксепшинами и stl

Кому писать дипломы и прочие курсовые - срочно брать и апгрейдить до современного окружения. А то развелось понимаешь питонятины :-)

 ,

MKuznetsov ()

По каким книжкам\ютубам\курсам местные изучали кресты?

Интересно узнать. А то я как дебил проспал все лекции по Си, теперь вот кресты учу по ютубу. Си не нравится (там в принтф надо %d пихать когда цифру выводишь :)) А вообще с чего лучше учить начинать? Уровень примерно: калькуль могу накидать, логические операции, мб еще чего могу, не пробовал пока все, матрицу транспонировать изи. короче уровень ниже начальной школы

По книжкам лучше или как?

В ютубе курсы понятные, но в стиле " здесь мы ставим иф, в скобочках условие, открываем фигурную, пишем код, который будет выполняться если условие выполнено, потом закрываем"

 ,

PURGEN143 ()

Проблемы с Telegram Bot API (webhooks)

День добрый.

Написал бота на C++, работающего через webhook.

Написал две версии, работающие через:

  • stunnel4
  • встроенный openssl

Обе версии испытывают одну и ту же проблему: данные приходят только после разрыва соединения с противоположного конца (когда у сервера Telegram проходит таймаут ожидания ответа). Т.е. у меня вызываются функции recv() или SSL_read() соответственно, которые:

  • на блокирующих сокетах возвращают все пришедшие данные, но уже после разрыва соединения, либо возвращают ничего по истечению таймаута, установленного через setsockopt(newsock, SOL_SOCKET, SO_RCVTIMEO, ...)
  • не неблокирующих сокетах возвращают ничего мгновенно и так 100500 раз в цикле, пока ТГ не разорвёт соединение - тогда за один вызов возвращаются все данные

Интересно то, что эта проблема только с серверами Telegram: по крайней мере, если я выполняю запрос curl -X POST -d 'тут json' -k https://MYBOTURL со своего компа к боту (бот на VPS), то всё выполняется успешно.

Может кто знает, с чем это может быть связано…

 , ,

Architector ()

Генератор уникальных псевдослучайных чисел (C++)

Нужно из случайного индекса вектора брать данные и копировать во второй вектор. Соостветственно нужны случайные итераторы которые не будут повторятся. Ничего кроме как городить проверяющий цикл с условием – не придумаю. Есть ли решения с использованием STL и <random>?

Казалось бы элементарная проблема, но завис на ней.

 , ,

Artamudo ()

c++ шаблон zip-like итератора?

В python есть крайне полезные функции zip, enumerate, range. Мне нужно что-то подобное для cpp/cuda (c++17). Если c range и enumerate более менее понятно, то как реализовать zip не соображу. Семантически это должно быть variadic template

template<typename t, typename... ts>
class zip : zip<ts...>{
	zip(t arg, ts... args);
	struct iterator;
	begin() -> iterator;
	end()   -> iterator;
};
Где итератор возвращает кортеж ссылок на элементы что с контейнерами можно было работать как:
for(auto [x,y,z] : zip(xs,ys,zs))
Рекурсивное наследование должно быть ограничено тривиальным случаем одного аргумента. Но, кажется, я думаю не в правильную сторону, в частности, не соображу как рекурсивно вывести тип возвращаемых итератором кортежей:
using ret_type = tuple<decltype(begin(declval<t>())), decltype(???)>

$cast AntonI, может у вас кто такое делал?

 , , ,

thunar ()

С++ удаляет локальные переменные

Узнал ужасную вещь. С++ удаляет локальные переменные.
Допустим создал я объект

Myclass xxx;
xxx.onready = func
xxx.start();

Создался объект, запустил start... Иии... Умер. Потом с++ запускает деструктор объекта. А мой колбек onready не дождется своего выхода.
Это нормально? Я же сам не удалял объект через delete. То есть получается компилятор сам за меня решает?

 

gobot ()

[Решено] Arduino ThingsBoard помогите разобраться с шаблонами.

Привет ЛОРчане!

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

У них даже есть свой типа SDK.

Проблема в том, что писали его в торопях и:

  • реализовали только ограниченный функционал RPC, прчем так, что с виджета knot, например, не получится поуправлять девайсом т.к. колбэк может возвращать только пары ключ-значение, но не может вернут real, например.

  • не реализовали подписку на атрибуты. Совсем.

Первый косяк я уже пофиксил, правда пришлось сломать совместимость с исходным api (нехорошо, но по другому было нельзя).

Сейчас думаю, как пофиксить второй косяк, но, т.к. я трогаю С++ второй раз в жизни, то есть определенные трудности понимания. В этой связи вопрос к плюсовикам: что значат вот эта строка и следующая?

По итогу обещаю выложить пофикшенную версию и сделать пулл-реквест. Doen! Спасибо @fsb4000!

 , ,

shkolnick-kun ()

Вопросик по C++ NULL

Я тут изучаю с++ ) Не могу понять как мне проверить что объект создан?

Process{
  public:
    Process(const char* cmd_){}
  ...
}


далее я объявляю
Process ffplay=NULL;

if(ffplay){} //ошибка
//conditional expression of type 'Process' is illegal

if(ffplay != NULL && !ffplay.isClosed()){} //ошибка
//binary '!=': no operator found which takes a left-hand operand of type 'Process' (or there is no acceptable conversion)



ffplay ведь изначально NULL(=0)

 ,

gobot ()

А у std::map старые итераторы остаются рабочими при модификации контейнера?

Понятно что речь идет о случае когда отвечающие итераторам элементы не были удалены.

std::map<T1, T2> M;
... тут мы что то в M напихали ...
I = M.find(k); // что то нашли
... тут мы вовсю добавляем/удаляем элементы в M, но элемент с ключем k НЕ удаляем
>>>> вот тут I рабочий? <<<

 , , ,

AntonI ()

Собрать все dll в один бинарь

Делаю программу на libavcodec, она цепляет avcodec.dll и прочие. Я хочу один бинарь, так как не удобно таскать dll всюду. Можно ли такое? Или нужно добавлять в проект весь исходный код ffmpeg и сомпилировать?

 , ,

gobot ()

Просьба подтвердить баг в Qt - QTBUG-88125 ошибка в MOC

Добрый день.

Версия Qt с данным багом: Qt5.15.1.

Версия Qt без данного бага: Qt5.12.9.

Повторно описывать подробно не буду, если что милости прошу на страницу бага (https://bugreports.qt.io/browse/QTBUG-88125).

Если у нас есть некий производный от QObject (или другого в его иерархии) с макросом Q_OBJECT и если в данном заголовочном файле есть подключение <bsoncxx/types.hpp> (напрямую или косвенно) то будет ошибка компиляции метаобъектным компилятором Qt (MOC).

Проблема заключается в следующих строках файла <bsoncxx/types.hpp>:

enum class type : std::uint8_t {
#define BSONCXX_ENUM(name, val) k_##name = val,
#include <bsoncxx/enums/type.hpp>
#undef BSONCXX_ENUM
};

И вот содержимое <bsoncxx/enums/type.hpp>:

#ifndef BSONCXX_ENUM
#error "This header is only meant to be included as an X-macro over BSONCXX_ENUM"
#endif

BSONCXX_ENUM(double, 0x01)
BSONCXX_ENUM(utf8, 0x02)
BSONCXX_ENUM(document, 0x03)
BSONCXX_ENUM(array, 0x04)
BSONCXX_ENUM(binary, 0x05)
BSONCXX_ENUM(undefined, 0x06)
BSONCXX_ENUM(oid, 0x07)
BSONCXX_ENUM(bool, 0x08)
BSONCXX_ENUM(date, 0x09)
BSONCXX_ENUM(null, 0x0A)
BSONCXX_ENUM(regex, 0x0B)
BSONCXX_ENUM(dbpointer, 0x0C)
BSONCXX_ENUM(code, 0x0D)
BSONCXX_ENUM(symbol, 0x0E)
BSONCXX_ENUM(codewscope, 0x0F)
BSONCXX_ENUM(int32, 0x10)
BSONCXX_ENUM(timestamp, 0x11)
BSONCXX_ENUM(int64, 0x12)
BSONCXX_ENUM(decimal128, 0x13)
BSONCXX_ENUM(maxkey, 0x7F)
BSONCXX_ENUM(minkey, 0xFF)

Update 0 Временное решение

Все директивы #include для подключения заголовочных файлов библиотеки bsoncxx/mongocxx оборачивать в блоки с применением макроса Q_MOC_RUN:

#ifndef Q_MOC_RUN
// start to include the bsoncxx/mongocxx library header files
#include <bsoncxx/types.hpp>
#include <bsoncxx/array/value.hpp>
#include <bsoncxx/array/view.hpp>
#include <bsoncxx/builder/stream/document.hpp>
#include <bsoncxx/document/value.hpp>
#include <bsoncxx/document/view.hpp>
// etc
#endif

Спасибо @aol

 , ,

rumgot ()

Вы теперь все так же пишете же ну?


auto main () -> int {
   return 0;
}

 , ,

slackwarrior ()

Выбор архитектуры

Привет всем, Помогите с выбором архитектуры. Использовать исключения или нет, какие есть аргументы за 1 решиение и за 2-е. Скажеться ли использование исключений на производительности?

Решение 1, с пробросом и обработкой исключений. Кажется код проще поддерживать, при этом:

class A {
public:
    std::mutex statusMutex;
    int status;
    std::string error;
    int getStatus() {
        std::unique_lock<std::mutex> lock(statusMutex);
        return status;
    }
    std::string getError() {
        std::unique_lock<std::mutex> lock(statusMutex);
        return error;
    }
    bool doX() {
	try {
		step1();
		// step2(); 
                // step3(); ...
		return true;
	} catch (const std::exception & e) {
	    std::unique_lock<std::mutex> lock(statusMutex);
            status = -1;
	    error = e.what();	
	    return false;
	}
    }
    void step1(){ 
	// ...
	// There has been a breakdown
	throw std::runtime_error ("step1 err");
    }
};

решение 2, без исключений, в плане работы на кодом кажеться не очень удобным из-за if

class A {
public:
    std::mutex statusMutex;
    int status;
    std::string error;
    int getStatus() {
        std::unique_lock<std::mutex> lock(statusMutex);
        return status;
    }
    std::string getError() {
        std::unique_lock<std::mutex> lock(statusMutex);
        return error;
    }
    bool doX() {
	step1();
	if (status == -1) return false;
	// step2(); 
	// if (status == -1) return false;
	// step3(); 
	// if (status == -1) return false;
	// ...
	return true;
    }
    void step1(){ 
	// ...
	// There has been a breakdown
	std::unique_lock<std::mutex> lock(statusMutex);
        status = -1;
	error = "step1 err";	
    }
};

int main() {
	A a;
        std::future<bool> the_a_result = std::async(&A::doX, &a);
	std::cout << "the_a_result = " << the_a_result.get() 
	          << ", a.status = " << a.getStatus() 
		  << ", a.error = '" << a.getError() << "'"
		  << std::endl;
	return 0;
}

 

cvprog ()

Какие инструменты умеют строить проектную модель по compile_commands.json?

Всем здравствуйте.

Собственно, вопрос.

Я пока что могу назвать лишь 3 инструмента, умеющих указанное:

  • SourceTrail,
  • CLion,
  • Visual Studio Code (через c_cpp_properties.json, очень криво).

Кто ещё?

Может быть, есть какие-л. модули расширения для Anjuta, QtCreator, Code::Blocks, KDevelop, Atom, или CodeLite?

 , , , ,

Bass ()

C++ Собственная функция для каждого экземпляра класса

Добрый день. Вот, допустим есть некий класс, обычный, с методами, свойствами и т.д. (описывает параметры неких электронных компонентов, не суть). В том числе должна быть некая функция, специфичная для экземпляра класса, принимающая некоторое различное число параметров и возвращающая double.

Как я понимаю, стандартным методом является указатели на функции, описанную где-то ещё, и специфичные для членов класса, передающиеся через конструктор/сеттер и т.д.

А не придумали ли в C++11 или что там сейчас поддерживает gcc, что-нибудь типа лямбд для определения функции прямо при создании экземпляра класса?

 

octy ()

Не получается расшифровать изображение?

Зашифровал скриншот рабочего стола фейстелем записал в tga, а обратно не получается, хотя обычный текстовый документ туда-обратно вроде без ошибок, куда капать? Вот скриншот до кучи https://dropmefiles.com/a1UlA

 , ,

bad_master ()