Возможно ли, что функция получит параметр, который может быть int OR char?
Я пытаюсь создать функцию, которая вводит ключ/значение в файл JSON.
Но, поскольку значением может быть int
или char
, я не хочу создавать по две функции для каждого типа.
Есть ли способ?
void setValue(char *key, char* value){
StaticJsonDocument<512> tempJDOC;
tempJDOC[key]=value;
}
Обновление1
#ifndef myJSON_h
#define myJSON_h
#include "Arduino.h"
#include <ArduinoJson.h>
#include "FS.h"
class myJSON
{
private:
bool _useSerial=false;
char _filename[30];
public:
char *ver="myJSON_v1.1";
myJSON(char *filename, bool useserial=false);
bool file_exists();
bool file_remove();
bool format ();
bool FS_ok();
void saveJSON2file(JsonDocument& _doc);
void readJSON_file(JsonDocument& _doc);
void printJSON(JsonDocument& _doc);
void PrettyprintJSON(JsonDocument& _doc);
const char *getValue (char *key);
template <class T>
void setValue(const char *key, T value);
//void setValue(const char *key, char *value);
};
#endif
EDIT2
#ifndef myJSON_h
#define myJSON_h
#include "Arduino.h"
#include <ArduinoJson.h>
#include "FS.h"
#define LOG_LENGTH 4
#define DOC_SIZE 512
template <class T> // . <---- line added
class myJSON
{
private:
bool _useSerial=false;
char _filename[30];
public:
char *ver="myJSON_v1.1";
myJSON(char *filename, bool useserial=false);
bool file_exists();
bool file_remove();
bool format ();
bool FS_ok();
void saveJSON2file(JsonDocument& _doc);
void readJSON_file(JsonDocument& _doc);
void printJSON(JsonDocument& _doc);
void PrettyprintJSON(JsonDocument& _doc);
const char *getValue (const char *key);
void removeValue(const char *key);
// void setValue(const char *key, char *value); <--- comment out
void updateArray(char* array_key, int val);
void printFile();
void setValue(const char *key, T value); <---- Added
};
#endif
и в файле .cpp:
void myJSON::setValue(const char *key, T value){
StaticJsonDocument<512> tempJDOC;
myJSON::readJSON_file(tempJDOC);
tempJDOC[key]=value;
myJSON::saveJSON2file(tempJDOC);
myJSON::PrettyprintJSON(tempJDOC);
}
@Guy . D, 👍0
Обсуждение2 ответа
Лучший ответ:
В C++ вы можете создать функцию-шаблон. (Оператор ArduinoJson []
также является шаблоном.)
#include <ArduinoJson.h>
StaticJsonDocument<512> tempJDOC;
template <typename T>
void setValue(const char *key, T value){
tempJDOC[key] = value;
}
void setup() {
Serial.begin(115200);
setValue("a", 5);
setValue("b", "xyz");
serializeJson(tempJDOC, Serial);
}
void loop() {
}
компилятор создаст функцию на основе этого шаблона для каждого типа, который вы используете в качестве второго параметра в своем скетче
При попытке взять такую функцию и поместить ее в библиотеку (используя «шаблон», как указано здесь), я получаю сообщение об ошибке. как это можно сделать?, @Guy . D
Под «поместить его в библиотеку» вы имеете в виду использование его как метода класса?, @Juraj
метод, который использует шаблон внутри класса, @Guy . D
добавьте код класса в Вопрос. это класс с отдельными файлами .h и .cpp? у вас тоже есть часть template<> объявления функции в .h?, @Juraj
вставил файл .h в свой Q, @Guy . D
почему ты использовал <класс T>? это должен быть шаблон <имя типа T>
, @Juraj
Я пытаюсь следовать примеру 2: https://www.programiz.com/cpp-programming/templates., @Guy . D
см. EDIT2 в моем вопросе, @Guy . D
вам нужен класс с функцией шаблона, а не класс шаблона https://stackoverflow.com/questions/972152/how-to-create-a-template-function-within-a-class-c, @Juraj
Да, я знаю... это самое близкое, что я смог найти, @Guy . D
Краткий ответ: «нет, это невозможно». Вам придется использовать два разные функции. Эти две функции могут иметь одно и то же имя, используя перегрузка функций. Вы даже можете иметь компилятор напишите эти функции для вас на основе предоставленного вами шаблона, как показано в ответе Юрай. Эти языковые особенности помогают создать иллюзию существует одна функция. Но это всего лишь иллюзия, хоть и полезный, который помогает улучшить читаемость программы. На фундаментальном уровне уровне, у вас все еще есть две разные функции.
Эдгар - спасибо за объяснение и полезную ссылку. Но я не понимаю, как ответ Юрая (с использованием шаблона) создает/дублирует функцию для других типов., @Guy . D
@Guy.D: Выполните поиск по запросу «шаблоны C++». Короче говоря, каждый раз, когда вы вызываете setValue() с новым типом значения, компилятор создает новую версию функции setValue(), подходящую для этого конкретного типа., @Edgar Bonet
В моем ответе есть: «Компилятор создаст функцию на основе этого шаблона для каждого типа, который вы используете в качестве второго параметра в своем эскизе»., @Juraj
@EdgarBonet Я использую вашу ссылку, чтобы попытаться реализовать эту функцию внутри созданной мной библиотеки (называемой myJSON
, как вы можете видеть в редактировании 1 и редактировании 2). Я буду признателен за вашу помощь еще раз, @Guy . D
- Невозможно преобразовать 'int (*)[size]' в 'int**': Cannot convert 'int (*)[size]' to 'int**'
- Как удалить элемент из массива arduino?
- Как передать несколько переменных в функцию?
- Есть ли функция Adafruit для инвертирования цветов моего экрана для языка Arduino?
- Как вернуть значение массива символов в функции Arduino IDE?
- Проблема с функцией, имеющей параметр со значением по умолчанию
- Ошибка: Переменная или поле объявлены недействительными
- Как получить переменную из функции обратного вызова?
как код, вызывающий функцию, решит, устанавливает ли он число или строку?, @Jaromanda X
Хм... Заголовок и текст вашего вопроса относятся к параметру char. Кажется, код предполагает, что вы на самом деле говорите о параметре
char *
. Итак, что это такое?char
илиchar *
? Это две совершенно разные вещи. Вам следует отредактировать свой вопрос и уточнить это., @AnT@AnT - вы правы, но на данный момент это закомментировано, поскольку, поскольку Джурай и Эдгар предложили использовать
template
, мне не нужно использоватьint
илиchar
, @Guy . DЕсли вам нужно передать либо int, либо char, вам вообще ничего не нужно делать. Вам не нужны никакие «шаблоны». Только одна версия функции
int
может охватывать все случаи, включаяchar
, поскольку в C и C++char
— это всего лишь небольшой целочисленный тип. Итак, еще раз, почему вы задаете этот вопрос? Какая проблема сchar
вызвала это? Опять же, предоставленный вами код подразумевает, что вам нуженchar *
(или, лучше,const char *
). Неchar
, аconst char *
. Вам необходимо отразить это в своем вопросе, поскольку на данный момент ни вопрос, ни принятый ответ не имеют смысла., @AnTИ когда вы используете шаблон, вы **используете
int
илиconst char *
, хотя вы делаете это *неявно*. Компилятор сделает это за вас. Но опять же, речь идет оint
иconst char *
, а не оint
иchar
, как вы указали в своем вопросе.char
здесь совершенно неуместен., @AnTЯ намерен использовать эту функцию, чтобы иметь возможность устанавливать значения
int
илиchar
в JSON, который сохраняется в конце файла. То, что предложили @Juraj и Edgar использовать шаблоны, решило эту проблему., @Guy . D«Решена» какая проблема? Какова исходная проблема? В своем вопросе вы говорите о написании двух функций - для
int
иchar
- и называете это *проблемой*, которую хотите решить. Но почему бы вам просто не использовать одну функцию — версиюint
– для обоих типов? Никаких шаблонов не требуется. Почему вы вообще решили, что здесь есть «проблема»?, @AnT