template<typename... args>
struct stream_op
{
    unsigned int size() { return sizeof...(args); }
};

template<typename... A, typename B>
stream_op<A..., B> operator<<(stream_op<A...> a, B b)
{
    // Do stuff
    return stream_op<A..., B>();
}

stream_op<> empty;

#include <iostream>
int main()
{
    std::cout << "length = " << (empty << 1 << 2).size() << "\n";
    std::cout << "length = " << (empty << 1 << 2 << 3).size() << "\n";
    std::cout << "length = " << (empty << 1 << 2 << 3 << 4).size() << "\n";
}
