Как я могу написать метод Print для переменных аргументов без шаблонов? - PullRequest
0 голосов
/ 28 апреля 2020
int temp=10;
string tempStr="hello";
LOG("test num:", temp, ", str:", tempStr);

#define LOG(...) Logger::getInstance().Print(__VA_ARGS__)

Я уже знаю, как я делаю печать, используя шаблон. Но мне интересно, что я могу сделать Print без шаблона? Это невозможно? Потому что я хочу сделать метод Print из виртуальной функции.

class Logger : public ILogger
{
public:
virtual void Print(...) override
{
// what should I do in here?
}
}

    class ILogger
    {
    public:
    virtual void Print(...) =0;
    }

1 Ответ

0 голосов
/ 28 апреля 2020

Если предположить, что в 99% случаев допустимое количество параметров (10 или меньше), то разумно использовать отдельный макрос LOG с постфиксом, подсчитывающим количество параметров. Тогда любой параметр, который может быть передан через потоковый оператор в класс stringstream, будет работать.

Что-то вроде следующего для поддержки параметров 1-4. Расширение до 5 или более параметров означает просто добавлять новые макросы.

void LogIt(const std::string& str)
{
    Logger::getInstance().Print(str.c_str());
}

#define LOG1(a) \
{ \
    std::ostringstream ss; \
    ss << a; \
    LogIt(ss.str()); \
}

#define LOG2(a, b) \
{ \
    std::ostringstream ss; \
    ss << a; \
    ss << b; \
    LogIt(ss.str()); \
}

#define LOG3(a, b, c) \
{ \
    std::ostringstream ss; \
    ss << a; \
    ss << b; \
    ss << c; \
    LogIt(ss.str()); \
}

#define LOG4(a, b, c, d) \
{ \
    std::ostringstream ss; \
    ss << a; \
    ss << b; \
    ss << c; \
    ss << d; \
    LogIt(ss.str()); \
}

int main()
{
    int temp = 10;
    std::string tempStr = "hello";
    LOG4("test num:", temp, ", str:", tempStr);
    return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...