Возможно ли, что функция получит параметр, который может быть 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);
}

, 👍0

Обсуждение

как код, вызывающий функцию, решит, устанавливает ли он число или строку?, @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


2 ответа


Лучший ответ:

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


1

Краткий ответ: «нет, это невозможно». Вам придется использовать два разные функции. Эти две функции могут иметь одно и то же имя, используя перегрузка функций. Вы даже можете иметь компилятор напишите эти функции для вас на основе предоставленного вами шаблона, как показано в ответе Юрай. Эти языковые особенности помогают создать иллюзию существует одна функция. Но это всего лишь иллюзия, хоть и полезный, который помогает улучшить читаемость программы. На фундаментальном уровне уровне, у вас все еще есть две разные функции.

,

Эдгар - спасибо за объяснение и полезную ссылку. Но я не понимаю, как ответ Юрая (с использованием шаблона) создает/дублирует функцию для других типов., @Guy . D

@Guy.D: Выполните поиск по запросу «шаблоны C++». Короче говоря, каждый раз, когда вы вызываете setValue() с новым типом значения, компилятор создает новую версию функции setValue(), подходящую для этого конкретного типа., @Edgar Bonet

В моем ответе есть: «Компилятор создаст функцию на основе этого шаблона для каждого типа, который вы используете в качестве второго параметра в своем эскизе»., @Juraj

@EdgarBonet Я использую вашу ссылку, чтобы попытаться реализовать эту функцию внутри созданной мной библиотеки (называемой myJSON, как вы можете видеть в редактировании 1 и редактировании 2). Я буду признателен за вашу помощь еще раз, @Guy . D