Ответы пользователя по тегу C++
  • Возможно ли проверить является ли T std::function?

    @Acaunt
    Если правильно понял вопрос, то можно сделать так:
    Пример
    #include <iostream>
    #include <functional>
    
    template<class T>
    struct is_function {
        constexpr static bool value = false;
    };
    
    template<class T>
    struct is_function<std::function<T>> {
        constexpr static bool value = true;
    };
    
    template<class T>
    constexpr static bool is_function_v = is_function<T>::value;
    
    template<class T>
    void check(T t) {
        if constexpr (is_function_v<T>) {
            std::cout << "is std::function" << std::endl;
        }
        else {
            std::cout << "is not std::function" << std::endl;
        }
    }
    
    void f2() {}
    
    int main() {
        std::function f1 = [](){};
        std::function f3 = f2;
        check(f1); // is std::function
        check(f2); // is not std::function
        check(f3); // is std::function
        
        return 0;
    }
    Ответ написан
    Комментировать
  • Правильно ли в C++ использовать директиву препроцессора define?

    @Acaunt
    define полезная штука и её не обязательно использовать так как ты (лично я не вижу смысла использовать её для этого).

    Например:
    Если у тебя много файлов ссылаются друг на друга то можно конечно использовать #pragma once, но эта штука работает не во всех компиляторах. Поэтому предпочтительнее использовать:
    #ifndef FILE_H
    #define FILE_H
    #include "file1.h"
    #include <iostream> например этот  заголовочный файл объявлен и в file1.h
    #endif // !FILE_H


    Ещё в заголовочном файле math.h есть константы (число пи например), но они скрыты если не объявлен #define _USE_MATH_DEFINES

    Подобную штуку я использовал в своем проекте вот пример:
    #if TYPE_64
    using type = uint64_t; 
    #elseif defined(TYPE_32)
    using type = uint32_t; 
    #elseif defined(TYPE_16)
    using type = uint16_t; 
    #else
    using type = uint8_t; 
    #endif


    Ещё можно подобные штуки расставить по всему коду для вывода информации о работе программы на проверку есть ли #define DEBUG, а когда программа готова то просто убрать этот define и программа будет чуть быстрее работать, так как участки кода с выводом информации не будут работать.
    Ответ написан
    1 комментарий
  • Почему конструктор присваивания не присваивает переменной значение суммы двух других переменных?

    @Acaunt
    Смотри у тебя вывод переменных происходит в конструкторе. Поэтому в операторе+ ты создаешь объект с параметрами по умолчанию, которые равны нулю, но после создания уже присваиваешь значения в этот объект.

    Ты можешь это лучше увидеть если добавишь одну строку с кодом в оператор+:

    trash operator + (const trash & other)
    	{
    		trash temp;
            temp.x = this->x + other.x;
    		temp.y = this->y + other.y;
                    cout << "x = " << temp.x << "\ty = " << temp.y << endl;
    		return temp;
    	}


    Эту строку ты можешь добавить и к другим операторам чтобы увидеть результат.

    Либо ещё один вариант как это можно сделать:

    trash operator + (const trash & other)
    	{
    		return trash(x + other.x,  y + other.y);
    	}


    Таким образом ты сразу в конструктор помещаешь необходимые значения.
    Ответ написан
    Комментировать
  • Как передать в аргумент функцию, и выполнить её, передаваю в неё параметры?

    @Acaunt
    Вот два простых примера как это можно сделать:
    #include <iostream>
    #include <functional>
    
    void f(const std::string& str) {
        std::cout << str;
    }
    
    void foo(void (*f)(const std::string&), const std::string& str) {
        f(str);
    }
    
    void Foo(std::function<void(const std::string&)> F, const std::string& str) {
        F(str);
    }
    
    
    int main() {
        foo(f, "Hello");
        Foo(f, " world");
        return 0;
    }


    foo пример без использования STL
    Foo пример с использованием STL

    Но возможно, если ты планируешь передавать функции с разными аргументами и их количествами, то можно попробовать сделать через какой-нибудь std::initializer_list, но таким образом и все функции тоже нужно переделать чтобы они принимали этот тип.
    Ответ написан
  • В чем ошибка блок-схемы?

    @Acaunt
    Ну снова привет. Уже отвечал на другой твой вопрос с другой блок схемой. Ты сам то можешь самостоятельно проанализировать свою блок схему?

    Ну ладно про эту блок схему:
    1) у тебя не все операции прописаны в блок схеме, и не все понятны что конкретно делает определённый блок например вывод в консоль.
    2) в цикле не правильно указаны пути от логического сравнения
    654330fa5ad27364227815.png

    Ну вроде это всё.
    Ответ написан
    Комментировать
  • В чем ошибка блок-схемы?

    @Acaunt
    Я последний раз трогал блок схемы в начальных классах поэтому возможно не совсем правильно нарисовал. Но основную мысль думаю можно увидеть.
    653189808fb8a794620742.png
    Первое что я заметил это перепутаны логические выходы проверки на количество оценок.
    Второе отсутствует операция сложения оценок.
    Третье как по мне не очень понятен был показан у тебя пути работы цикла, не было стрелки того куда идти для повторения цикла и логический выход из цикла.
    Возможно ещё что-то, но я не совсем хорошо помню эти блок схемы.
    Ответ написан
    Комментировать
  • Ошибка: for требуется объявление. Как исправить?

    @Acaunt
    Для начала просто убери цикл в классе. Циклы не вставляют прямо в класс, а вставляют в методы.
    Ответ написан
    3 комментария
  • Как построчно записать файл в каждый элемент массива LittleFS?

    @Acaunt
    С Ардуино не знаком, но вот как это можно сделать в стиле C++:
    Функция чтения
    #include <fstream>
    #include <vector>
    
    bool read_file(std::string name_file, std::vector<std::string> &arr) {
        // Открываю текстовый файл для чтения
        std::ifstream read;
        read.open(name_file);
        
        // Проверяю открылся ли текстовый файл.
        // Если не открылся, то выхожу из функции с возвратом значения ЛОЖЬ
        if (!read.is_open()) {
            read.close();
            return false;
        }
        
        // Читаю текстовый файл до конца
        while (!read.eof()) {
            // Получаю текстовое значение одной строки в текстовом файле
            std::string str;
            getline(read, str);
            
            // Добавляю полученое текстовое значение в конец вектора
            arr.push_back(str);
        }
    
        read.close();
        
        // Выход из функции с возвратом значения ИСТИНА
        return true;
    }
    Пример использования
    #include <iostream>
    #include <vector>
    
    int main() {
        // Вектор в который будем записывать значения тектового файла
        std::vector<std::string> arr;
        
        // Проверяем получилось ли прочесть текстовый файл
        // Если не получилось выполняем какой-нибудь код
        if (!read_file("C:\\Text.txt", arr)) {
            std::cout << "Fail read file" << std::endl;
        }
        
        return 0;
    }
    P.S. Если возникнут вопросы пиши
    Ответ написан
    2 комментария