cpp:template - Как решить проблему " cannot convert from 'char* const' to int "?

140
29 ноября 2021, 03:10

Разбираюсь с template-ми на c++. Написал небольшую функцию которая принимает, какой-то объект MyJSON* _value и в реализации сделал разбор в зависимости от типа содержимого что бы функция возращала его результат. Компилятор выдает ошибку Error 224 error C2440: 'return' : cannot convert from 'char *const ' to 'int' *_myjson.h

код template:

template<typename T> 
T get_value_from_json(const MyJSON* _value)
{
    if (_value->type == 1)
        return _value->valueint;
    if (_value->type == 2)    
        return _value->valuedouble;
    if (_value->type == 3) {   
        return _value->valuestring;
}
// ------------------------------------------------
// примерно что хотелось бы увидеть:
int a = get_value_from_json(json_value);
// если значения нет, то возврат значения nullptr
const char* str = get_value_from_json(json_value);

Может есть возможность через специализацию шаблона, указать какой именно тип следует обрабатывать компилятору с учетом LVALUE? Или как пример есть static_assert, может что то подобное можно реализовать для выбора какое условие для конкретного типа обрабатывать?

к сожалению не совсем разобрался как решать подобные вещи с помощью template-ов.

Спасибо за помощь!

Answer 1

Шаблоны здесь не нужны.

Функция может возвращать только значение конкретного типа. Можно эмулировать динамическую типизацию с помощью std::variant или std::any, но это не очень удобно.

Больше подойдет proxy-объект с несколькими операторами приведения типа. Примерно так:

class json_value_proxy
{
    const MyJSON* _value;
public:
    json_value_proxy(const MyJSON* value) : _value(value) {}
    operator int () const {
        if(_value==nullptr) 
            throw std::runtime_error("No value!");
        if (_value->type == 1) 
            return  _value->valueint;
        else
            throw std::runtime_error("Wrong type!");
    }
    operator double () const  { ... }
    operator const char* () const { ... }
};
json_value_proxy get_value_from_json(const MyJSON* _value) {
      return json_value_proxy(_value);
}

Следует отдельно обдумать политику поведения при несоответствии запрошенного типа и типа переданного в _value. Приведение типа, lexcal_cast или исключение? Эта политика совсем не очевидна из постановки задачи.

Answer 2

Можно так, как вы написали, только вызывать надо соответствующим образом:

auto a = get_value_from_json<int>(json_value);

и так далее, меняя тип.

READ ALSO
Compile time C++ checksum

Compile time C++ checksum

Есть структура:

222
Проблема с отображением текстур

Проблема с отображением текстур

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

261
Ошибка при переписывание кода в функции

Ошибка при переписывание кода в функции

Попалась вот такая задача:

129
Создать класс по обработке массива данных

Создать класс по обработке массива данных

ООП в плюсах для меня тема новаяНужно написать класс my_sample который должен иметь среди своих приватных полей вектор long double, который назвать...

104