C++ 将字符串打印到C++;

C++ 将字符串打印到C++;,c++,object,reference,constants,temporary,C++,Object,Reference,Constants,Temporary,我有一种特殊类型的ostringstream,我试图将文本作为临时对象输出到它,但遇到了一些问题。明确地说,这基本上就是我想要做的: ostringstream() << "PARTY DOWN!" << endl; ostringstream()。您希望实现一个基本的_streambuf,它写入您的特殊字符串 流本身负责格式化和类似的功能;streambufs负责最终成为数据接收器的内容 毕竟,stringstream是一个iostream,附带了一个基本的strin

我有一种特殊类型的ostringstream,我试图将文本作为临时对象输出到它,但遇到了一些问题。明确地说,这基本上就是我想要做的:

ostringstream() << "PARTY DOWN!" << endl;

ostringstream()。您希望实现一个基本的_streambuf,它写入您的特殊字符串

流本身负责格式化和类似的功能;streambufs负责最终成为数据接收器的内容


毕竟,stringstream是一个iostream,附带了一个基本的stringbuf。

也许有更好的方法,但我想出了另一个解决方案:

#include <iostream>
#include <sstream>

class LogClass
{ 
    template <typename T>
    friend const LogClass& operator << (const LogClass& lc, const T& v);
public:
    LogClass()
        : str(new std::ostringstream())
        , refCount(new int(1))
    {}

    LogClass(const LogClass& other)
        : str(other.str)
    {
        ++(*refCount);
    }

    ~LogClass()
    {
        --(*refCount);
        if (!*refCount)
        {
            delete refCount;
            std::cout << str->str() << std::endl;
            delete str;
        }
    }
private:
    mutable std::ostringstream *str;
    int *refCount;

    LogClass& operator = (const LogClass&);
};

template <typename T>
const LogClass& operator << (const LogClass& lc, const T& v)
{
    (*lc.str) << v;
    return lc;
}

int main(int , char**)
{
    for (size_t i = 0; i < 10 ; ++i)
    {
        LogClass() << "PARTY DOWN! " << i;
    }
}
#包括
#包括
类LogClass
{ 
模板

friend const LogClass&operator这里是我正在使用的解决方法:

#define STRM2STR(x) (dynamic_cast<std::ostringstream &>(std::ostringstream() << std::dec << x).str())

#define STRM2STR(x)(dynamic_cast(std::ostringstream())我怀疑这就是原因,因为如果是,那么
就不能再编写更多的代码了..特别是您的特殊字符串实现我们能看到显示该行为的SpecialStringStream的最小完整实现吗?(另外,这不是一个不寻常的习惯用法——您可以很容易地想象,例如,
SomeLogger(),我相信您的specialstringstream()实现在某种程度上是错误的…请粘贴代码,这很有趣!可能再次复制Brilliant!我从未想过这一点。@LokiAstari:我从未声称过。这是关于右值与左值的关系。在您的示例中,
std::cout
是左值。虽然这确实有效,我感谢您的帮助,但我应该在我的问题中提到我It’他正在寻找一种解决方法,使代码能够正常工作,而不必更改现有代码库执行输出的每个位置。也许可以通过向特殊类添加运算符重载。您可以将运算符更改为
std::ostream&operatorAlas,我需要在VC8中编译此代码。我似乎无法在hat环境.rvalue引用不受支持,它声明:“'const_cast':无法从'const ostream'转换为'ostream'。转换需要构造函数或用户定义的转换运算符,const_cast或reinterpret_cast不能使用该运算符。”我想我要做的是确保我在这里用新类实现的功能在旧编译器上关闭。
template <class T>
std::ostream& operator<<(const SpecialStringStream &o, T msg)
{
    return static_cast<std::ostream&>(const_cast<SpecialStringStream&>(o)) << msg;
}
{
  specialstringstream ss;
  ss << "Hello world" << std::endl; // OK, can bind to lvalue
}
std::ostream & operator<<(specialstringstream && o, const char * s)
{
  return o << s; // note: *not* "std::move(o)"
}
#include <iostream>
#include <sstream>

class LogClass
{ 
    template <typename T>
    friend const LogClass& operator << (const LogClass& lc, const T& v);
public:
    LogClass()
        : str(new std::ostringstream())
        , refCount(new int(1))
    {}

    LogClass(const LogClass& other)
        : str(other.str)
    {
        ++(*refCount);
    }

    ~LogClass()
    {
        --(*refCount);
        if (!*refCount)
        {
            delete refCount;
            std::cout << str->str() << std::endl;
            delete str;
        }
    }
private:
    mutable std::ostringstream *str;
    int *refCount;

    LogClass& operator = (const LogClass&);
};

template <typename T>
const LogClass& operator << (const LogClass& lc, const T& v)
{
    (*lc.str) << v;
    return lc;
}

int main(int , char**)
{
    for (size_t i = 0; i < 10 ; ++i)
    {
        LogClass() << "PARTY DOWN! " << i;
    }
}
#define STRM2STR(x) (dynamic_cast<std::ostringstream &>(std::ostringstream() << std::dec << x).str())