【问题标题】:Is there a way to compare a generic type (template) with a concrete type in c++?有没有办法将泛型类型(模板)与 C++ 中的具体类型进行比较?
【发布时间】:2023-03-17 15:04:01
【问题描述】:

我偶然发现了一个关于模板和泛型类型的问题。
我想做的是:

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

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

    return *this;
}

基本上我想检查泛型参数流是否等于“\n”,但编译器不断抛出错误。我尝试了强制转换(静态),但编译器也不喜欢这样。

有什么建议吗?

【问题讨论】:

  • 你如何使用这个功能,或者你想如何使用这个功能?你把什么传递给函数?您可能需要对字符串或字符进行非泛型重载。
  • 发布错误和您所做的事情,而不是省略相关信息(编译器错误)和源(您已用“伪代码”替换的内容),这显然是一个好主意。
  • 模板不允许您编写使用该类型无法正常编写的代码。
  • 您的编译器是否支持 C++11? (即,相对较新的 gcc 或 clang 版本?)

标签: c++ templates generics


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    找到适合我的解决方案:

    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 实例正在执行格式化并将流内容的有效表示形式返回为 std::stringstr()
    什么没用

    用另一个声明 f.e. 重载操作符

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

    因为模板化的重载将首先被编译。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-06-24
      • 2015-01-31
      • 1970-01-01
      • 2018-09-20
      • 1970-01-01
      • 1970-01-01
      • 2020-07-03
      • 1970-01-01
      相关资源
      最近更新 更多