C++ 隐式转换运算符

C++ 隐式转换运算符,c++,gcc,c++11,variadic-templates,explicit-conversion,C++,Gcc,C++11,Variadic Templates,Explicit Conversion,我想使用C++11的可变模板功能打印函数的所有参数。我做了以下几件事: struct concatenate { template< typename ...ARGS > explicit concatenate(ARGS const & ...args) { cat(args...); } /*explicit*/ operator std::string const () const {

我想使用C++11的可变模板功能打印函数的所有参数。我做了以下几件事:

struct concatenate
{

    template< typename ...ARGS >
    explicit
    concatenate(ARGS const & ...args)
    {
        cat(args...);
    }

    /*explicit*/
    operator std::string const () const
    {
        return oss.str();
    }

private :

    std::ostringstream oss;

    void cat() const
    { ; }

    template< typename T, typename ...ARGS >
    void cat(T const & head, ARGS const & ...tail)
    {
        if (oss.tellp() > 0) {
            oss << ' ';
        }
        oss << head;
        cat(tail...);
    }

};
struct连接
{
模板
明确的
连接(ARGS常量和…ARGS)
{
cat(args…);
}
/*明确的*/
运算符std::string const()const
{
返回oss.str();
}
私人:
std::ostringstream oss;
无效cat()常量
{ ; }
模板
无效猫(T常数和头部,ARGS常数和尾部)
{
if(oss.tellp()>0){

oss因为您没有使用显式转换运算符并且没有重载
运算符因为您没有使用显式转换运算符并且没有重载
运算符运算符运算符转换运算符是显式的,但是您没有进行显式转换。这没有什么区别。没有
explicit
关键字都是一样的。转换运算符是显式的,但您没有进行显式转换。这没有什么区别。没有
explicit
关键字都是一样的。
template <class charT, class traits, class T>
basic_ostream<charT, traits>&
operator<<(basic_ostream<charT, traits>&& os, const T& x);
std::string(concatenate(1, 2, 3, 4, std::string("ololo"), "alala", 'o', 1.2, 1.2L, 1.2f))