0

私は次のようなものを構築したい、

template<class Ostream, int N>
class StreamPrinter{
public:
    StreamPrinter(Ostream& out, std::string tail = "\n", std::string head = "", std::string middle = "\t")
    : out(out)
    , tail(tail)
    , head(head) {}


    template<class... Data>
    void operator()(const Data&... dat){
        //if N = 3,
        //out << head <<  dat1 << middle << dat2 << middle << dat3 << tail;
        //where dat# means the #'s argument of dat...
    }

private:
    Ostream& out;
    std::string tail;
    std::string head;
    std::string middle;
};

operator()テンプレートパラメータに応じて動作が異なるものを構築したいN。の動作N=3は上記のコードで説明されています。と仮定しsizeof...(dat) >= Nます。

しばらくやってみた。しかし、私はそれを達成できませんでした。アドバイスをお願いします。:)

4

2 に答える 2

3
#include <string>
#include <iostream>

template<class Ostream, int N>
class StreamPrinter{
public:
    StreamPrinter(Ostream& out,
                  std::string tail = "\n",
                  std::string head = "",
                  std::string middle = "\t")
    : out(out)
    , tail(tail)
    , head(head) {}


    template<class... Data>
    void operator()(const Data&... dat)
    {
        static_assert(sizeof...(Data) >= N,
                      "Not enough arguments supplied for `operator()`");

        out << head;
        print(N, dat...);
        out << tail;
    }

private:
    void print(int) {}

    template<class D, class... Data>
    void print(int printed, D const& p, Data const&... pp)
    {
        if(0 == printed) { return; }

        out << p;
        if(sizeof...(Data) > 0)
        {
            out << middle;
            print(printed-1, pp...);
        }
    }

    Ostream& out;
    std::string tail;
    std::string head;
    std::string middle;
};


int main()
{
    StreamPrinter<std::ostream, 4> foo(std::cout);
    foo(1,2,3,4,5,6);
}
于 2013-05-29T13:57:19.040 に答える