使用命令行参数控制程序中的打印输出

Controlling print outs in a program with command line argument

我试图在我的程序中控制打印输出。我为此编写了一个小脚本,它接受一个命令行参数并根据传递给它的标志 -v 决定打印或不打印。现在我必须在我的实际程序中到处写 out(bool) 。是否可以在程序开始时做出决定,只使用 out 而不是 out(bool).

class mystreambuf : public std::streambuf
{
};
mystreambuf nostreambuf;
std::ostream nocout(&nostreambuf);
#define out(b) ((b==true)?std::cout : nocout )

int main(int argc, char* argv[])
{

    std::cout << "Program name is: " << argv[0] << "\n";

    int counter;
    bool verbose;

    if (argc == 1)
    {
        std::cout << "No command line argument passed" << argv[0] << "\n";
    }

    if (argc >= 2)
    {
        for (counter = 0; counter < argc; counter++)
        {
            std::cout << "Argument passed are: " << argv[counter] << "\n";
            if (strcmp(argv[counter], "-v") == 0)
            {
                verbose = true;
            }
            else
            {
                verbose = false;
            }
        }
    }

    out(verbose) << "\n hello world \n";

    system("pause");
}

您可以创建一个您在开始时设置的单例实例并登录。类似于:

class Printer {
    public: static std::streambuf getInstance() {
        if (_instance._printing) {
           return std::cout;
        }
        return _instance._nostreambuf;
    }
    static void setPrinting(bool set) {
        _instance._printing = set;
    }
    private:
    static Printer _instance;
    mystreambuf _nostreambuf;
    bool _printing;
    // delete constructors and assignment operators.
}

注:快速伪代码,未测试。

你会使用哪个:

Printer::setPrinting(verboseBool);
Printer::getInstance() << "Print text";

但是你要做的是一个记录器。其中有很多。 Here is a nice list.

只需将 out 作为以下两个选项之一的变量:

std::ostream &out = verbose ? std::cout : nocout;

并使用 out <<

继续打印

一个简单的方法是构建一个包含布尔标志和对实际流的引用的最小 class。那么 << 运算符要么是空操作,要么是对实际流的委托。可能是:

class LogStream {
    std::ostream& out;
    bool verbose;
public:
    LogStream(std::ostream& out = std::cout): out(out) {}
    void set_verbose(bool verbose) {
    this->verbose = verbose;
    }
    template <class T>
    LogStream& operator << (const T& val) {
    if (verbose) {
        out << val;
    }
    return *this;
    }
};

然后可以这样使用:

int main(int argc, char* argv[])
{

    LogStream out;
    ...
    out.set_verbose(verbose);
    out << "\n hello world \n";
    ...
}