Существует ли оператор потока для функций-членов класса? - PullRequest
0 голосов
/ 11 февраля 2019

Я включил регистратор от boost.Мне очень приятно, как это работает.Просто для простоты и по причине того, что я не хочу часто использовать makros в своем коде, я обертываю его в классе.

Теперь мне интересно, могу ли я использовать потоковый оператор << для записи вфункция-член.

код

class LogWrapper{
    ...
    //debug function
    //info function
    ...
}

void main() {
    LogWrapper log;
    log.debug() << "some debug msg"; // does this exist?
    log.info() << "some info msg";
}

выход

[some_timestamp][debug]  some debug msg
[some_timestamp][info]   some info msg

Возможно ли это в хорошей практике илиэто совсем плохой стиль?

Ответы [ 2 ]

0 голосов
/ 11 февраля 2019

Это можно легко сделать так:

#include <iostream>

class A {
  public:
    std::ostream &debug() const {
      std::cerr << "[timestamp]" << "[DEBUG]";
      return std::cerr;   
    }
};

int main()
{
    A a;
    a.debug() << "Test";
}

Но важный вопрос здесь такой: должны ли мы реализовать это таким образом?По моему мнению, NO!

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

int main()
{
    A a;
    a.debug() << "Test" << std::endl;
    a.debug() << "Test2" << std::endl;
}

Вывод:

[timestamp][DEBUG]Test
[timestamp][DEBUG]Test2

Но что если пользователь выберет этот способ:

int main()
{
    A a;
    auto &out = a.debug();
    out << "Test" << std::endl;
    out << "Test2" << std::endl;
}

Вывод:

[timestamp][DEBUG]Test
Test2

Я бы настоятельно рекомендовал не возвращать объект потока.Вы должны использовать функции-члены для этой цели.

#include <iostream>

class A {
  public:
    static void debug(const std::string &log) {
      std::cerr << "[timestamp]" << "[DEBUG]" << log << std::endl;
    }
};

int main()
{
    A::debug("Test 1");
    A::debug("Test 2");
}

Вывод:

[timestamp][DEBUG]Test 1
[timestamp][DEBUG]Test 2
0 голосов
/ 11 февраля 2019

Я не думаю, что это существует, потому что когда вы пишете:

int nb = a.funcFoo() + a.funcBar();

Если a.funcFoo () возвращает целое число со значением 3, а a.funcBar () возвращает целое число, котороеимеет значение 5, тогда код в этих двух функциях выполняется заранее, и они затем «заменяются» в выражении их возвращаемым значением, что дает нам:

int nb = 3 + 5;

Так что это означает, что в вашемВ этом случае a.func () заменяется возвращаемым значением:

(your returned value) << "test";

Если вы хотите, чтобы оператор потока действовал на возвращаемое значение, то, возможно, вы могли бы перегрузить оператор потока, перегрузка оператора позволяет вамопределить, что делает оператор, в зависимости от того, что до и после него.Для получения дополнительной информации: https://en.cppreference.com/w/cpp/language/operators

Глядя на добавленный вами комментарий, я все еще не совсем понимаю, что вы хотите сделать, но я думаю, что это возможно, просто используя перегрузку параметров и функций.Перегрузка функций позволяет создавать несколько функций, которые принимают разные параметры, но имеют одно и то же имя.

Например (используя имя вашего класса):

void ClassA::test(std::string const &str)
{
    std::cout << "We received a string!" << std::endl;
}

void ClassA::test()
{
    std::cout << "We received nothing..." << std::endl;
}

В зависимости от того, проверен ли тест ()Функция получила строку или не получила ни одного параметра, один из этих двух методов.

Если вы хотите, вы можете сделать, например:

void ClassA::func(std::string const &debugMessage)
{
    std::cerr << "DEBUG: " << debugMessage << std::endl;
    func();
}

void ClassA::func()
{
    //Do stuff
}

Здесь, если вы вызываете func() со строкой в ​​качестве параметра, она покажет отладочное сообщение, затем она вызовет функцию func (), которая не принимает никаких параметров, но вы также можете вызвать функцию func () без каких-либо параметров, и сообщение об отладке не будетпоявляются!Для получения дополнительной информации: https://www.geeksforgeeks.org/function-overloading-c/

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