2015-04-04 82 views
-1

我偶然发现了一个关于模板和泛型类型的问题。
我想要做的是:有没有办法在C++中比较泛型类型(模板)和具体类型?

template <typename T> 
Log& operator<<(const T &stream) { 
    buffer_.stream << stream; 

    if(stream == "\n")  //Pseudocode 
     write(buffer_); 

    return *this; 
} 

基本上我要检查,如果一般的参数流等于“\ n”,但是编译器不断抛出的错误。我尝试铸造(静态),但编译器不喜欢这一点。

有什么建议吗?

+0

您如何使用此功能,或者您想如何使用该功能?你传递给函数的是什么?您可能必须为字符串或字符进行非泛型重载。 – 2015-04-04 11:57:53

+1

可能是一个明显的好主意来发布错误和你所做的而不是省略相关信息(编译器错误)和源代码(你已经用“伪代码”代替了)。 – 2015-04-04 11:58:19

+0

模板不允许您编写无法正常使用该类型写入的代码。 – chris 2015-04-04 11:59:00

回答

0

发现,对于我工作的解决方案:

template <typename T> 
Log& operator<<(const T &stream) { 
    std::ostringstream check; 
    buffer_.stream << stream; 
    check << stream; 
    if(!check.str().compare("\0")) 
     write(buffer_); 

    return *this; 
} 

std::ostringstream实例做了格式化,并返回流的内容与str()一个std::string的有效表示。
什么没有工作

重载操作< <与另一声明f.e:

Log& operator<<(const char* stream) { 
     buffer_.stream << stream; 
     if(!strcmp(stream, "\n")) 
      write(buffer_); 
     return *this; 
    } 

,因为模板超载将被首先编译。

0

这取决于您的T类型。一般来说,模板背后的全部魔力在于,您只需在第一次使用该模板时就填写该类型;因此,如果你的编译器抛出错误,那是因为你使用的T,你的比较不起作用。

相关问题