Разбираюсь с 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-ов.
Спасибо за помощь!
Шаблоны здесь не нужны.
Функция может возвращать только значение конкретного типа. Можно эмулировать динамическую типизацию с помощью 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 или исключение? Эта политика совсем не очевидна из постановки задачи.
Можно так, как вы написали, только вызывать надо соответствующим образом:
auto a = get_value_from_json<int>(json_value);
и так далее, меняя тип.
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Здраствуйте, пробую реализовать арканоид, но столкнулся с проблемой, что текстуры привязуется к не правильным участкам пространстваУ меня...
ООП в плюсах для меня тема новаяНужно написать класс my_sample который должен иметь среди своих приватных полей вектор long double, который назвать...