c ++操纵器

时间:2010-05-26 05:48:38

标签: c++ formatting iostream

我有一个班级:

template<class T>
class matrix
{
private:
    int COLS,ROWS;
public:
    inline matrix(int r,int c){
        this->COLS=r;
        this->ROWS=c;
    }

    template<class T2>
    friend ostream& info(ostream& os);
};

我尝试了很多方法来实现info函数。但是没有一个成功。

我想在主要功能中使用它

Matrix<int> M(10,20);

cout<<info<<M;

我想输出Matrix类的cols和行信息。

我已经尝试了很多时间来实现朋友类信息,但失败了。

任何人都可以告诉我怎么做?

抱歉,我忘了把&lt;&lt;超载部分。

template<class T2>
friend ostream& operator<< (ostream &out,matrix<T2> &cMatrix);

实施:

template<class T2>
ostream & operator<<(ostream &out, matrix<T2> &cMatrix) {
    out<<cMatrix.getCOLS();// sorry for didn't put the get function, it's not easy to put code line by line here.
    out<<cMatrix.getROWS();
    return out;
}

我的&lt;&lt;操作有趣。

但是当我想使用信息时,我遇到了错误。

我不确定,如何将自己的类型操纵器实现为友元函数。 我谷歌一些,但他们不是朋友的功能。而且,它是一种模板 功能

这就是我的意思:

template<class T2>
ostream& info(ostream& os,matrix<T2> &cMatrix)
{
    int cols=cMatrix.getCOLS();
    int rows=cMatrix.getROWS();
    os<<rols<<"X"<<rows<<"  matrix "<<endl;
    return os;
}

4 个答案:

答案 0 :(得分:2)

如果你想模仿像cout << setw(8) << …这样的操纵器,那么就没有标准的设施,只能用一个函数来完成它。

带参数的操纵器是工厂函数,可以创建特殊的仿函数。返回的对象会记住操纵器的参数,并实现operator<<以使用它。

示例代码中有两种不同的方法。

cout<<info<<M; // info changes cout somehow?

ostream& info(ostream& os,matrix<T2> &cMatrix) // info behaves like operator<<?

第一种方法是将状态添加到cout,但这样做太复杂了。

第二种方法引出了一个问题,为什么你不要只称它为operator<<并完成。

或者,您可以直接拨打第二个:info(cout << "hello", M) << "world";

如果您正在寻找更像是操纵器的语法cout << info(M),您需要类似

的内容
struct print_info {
    Matrix &m;
    print_info( Matrix &in ) : m(in) {}
    friend ostream &operator<<( ostream &str, print_info const &pi ) {
         str << pi.m.getcols();
         …
    }
};

print_info info( Matrix &in )
    { return print_info( in ); }

严格来说,这个函数是不必要的,但最好不要给一个具有这样一个特定函数的类,如info这样的通用名称。

但话说回来,所有这些都是不必要的。只需使用您拥有的<<覆盖即可。

答案 1 :(得分:1)

一种可能的方法,如果你不需要它是粘性的:

class InfoPrinter {
    std::ostream& os_;
public:
    InfoPrinter(std::ostream& os) : os_(os) {}
    template<class T> std::ostream& operator<<(const Matrix<T>& m) {
        return os_ << m.getCols() << ", " << m.getRows();
    }
};

struct Info {} info;

InfoPrinter operator<<(std::ostream& os, const Info&) {
    return InfoPrinter(os);
}

用法就是例如:

std::cout << info << Matrix<int>(2,3);

答案 2 :(得分:0)

我相信只需创建ostream& operator<<(ostream& os);作为Matrix类的成员即可。然后你可以去cout << M << endl;

答案 3 :(得分:0)

您应该尝试重载输出运算符。点击here获取有关如何操作的信息。如果您发布更新的代码,我会在必要时为您提供更多帮助。