эффективная обработка создания шаблона для команды SET redis (hiredis) - PullRequest
3 голосов
/ 22 января 2020

Я новичок в Redis. Я хочу написать простую библиотеку (для тестирования), которая находится на верхнем уровне hiredis. Например, чтобы реализовать команду SET, я написал следующий код:

#include<iostream>
#include<type_traits>
#include<hiredis.h>
#include<string>

using namespace std;

template<typename T>
string set(string key, T value)
{
    /* set a key */
    if(is_same<T, int>::value)
    {
        reply = (redisReply*) redisCommand(c, "SET %s %d", key, value)  // c is redisContext* 
    }
    else if(is_same<T, string>::value)
    {
        reply = (redisReply*) redisCommand(c, "SET %s %s", key, value)
    }

    // and so on for other data types ...

    string replyStr = reply->str;
    freeReplyObject(reply);
    return replyStr;     
}

Есть ли лучшее решение для обработки различных типов данных в качестве значения для команды SET? (Я имею в виду избегать использования операторов If для каждого типа данных). С уважением.

1 Ответ

1 голос
/ 22 января 2020

Если я правильно понимаю, вам нужно знать только тип value, чтобы знать, какой тип вы вставляете в строку redisCommand при написании ответа.

Если вы ограничиваете эти типы к базовым c типам попробуйте вызвать to_string на value, чтобы получить результат std::string

для получения дополнительной информации https://en.cppreference.com/w/cpp/string/basic_string/to_string не забудьте включить конечно!

примерно так:

template<typename T>
string set(string key, T value)
{
    std::string result(std::string("SET ") + to_string(key) + to_string(value));
    reply = (redisReply*) redisCommand(c, result);

    string replyStr = reply->str;
    freeReplyObject(reply);
    return replyStr;     
}

РЕДАКТИРОВАТЬ: Другое жизнеспособное решение - просто приводить переменную каждый раз, когда вы вызываете 'set', и просто переписываете свою функцию как string set(string key, string value) .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...