当前位置: 首页 > 知识库问答 >
问题:

在类中包装ostream并模板化

顾兴昌
2023-03-14

我想把C流包装在一个模板类中,这样所有

你能改变下面的代码,使它编译时不会改变整体意图吗?

#include <iostream>
class Foo
{
private:

    std::ostream& os;

public:

    explicit Foo( std::ostream& os ) : os( os ) {};

    template<class T>
    Foo& operator<<( const T& t )
    {
        os << t << '!';
        return *this;
    }

};

int main()
{

    Foo( std::cout ) << "test" << '\n'; // works fine 
    Foo( std::cout ) << "test" << std::endl; // compilation error

    return 0;
}

我假设std::endl具有某种类型,因此被模板化方法“捕获”。

共有2个答案

殷宾白
2023-03-14

你也许应该用SFINAE来保护它,并完美地转发这个论点。

    template<class T> auto operator<<(T &&t)
         -> decltype(os << std::forward<T>(t) << '!', *this)
    {
            return os << std::forward<T>(t) << '!', *this;
    }

现在,这应该接受每个参数 std::ostream 可以打印并且无法与其他所有内容一起编译。

严承允
2023-03-14

正如kmdreko所建议的,您需要为模板函数添加一个重载

(std::endl是模板函数,不是类或简单类型)

像这样:

#include <iostream>
class Foo
{
private:

    std::ostream& os;

public:

    explicit Foo(std::ostream& os) : os(os) {};

    // for classes
    template<class T>
    Foo& operator<<(const T& t)
    {
        os << t << '!';
        return *this;
    }

    // for endl
    Foo& operator<<(std::ostream& (*pf) (std::ostream&)) {
        os << pf;
        return *this;
    }
};
 类似资料:
  • 问题内容: 有没有一种方法可以为使用模板的Cython包装的C ++类创建Python包装器?(即完全按照此处显示的内容进行操作,但要使用模板:http : //docs.cython.org/src/userguide/wrapping_CPlusPlus.html#create-cython- wrapper- class)。 我知道融合类型的变通方法(https://groups.googl

  • 是否有一种方法可以将Thymeleaf模板存储在与类相同的包中而不是或?例如,这样的结构: 为了实现这一点,我必须如何配置Spring和Thymeleaf?

  • 我有以下问题:一个类模板a,有几个模板参数,我想构建一个类B,它以a为模板参数,并提取a的第一个模板参数,以便在某种方法中使用它(想想从std::vector 中提取int并返回默认的int{})。 我知道这种天真的方法不会编译,但我不知道如何实现这样的东西。感谢任何提示。

  • 还尝试在专门化的中进行模板方法专门化: 这一次它编译,但调用原始方法,即 解决方案

  • 问题内容: 我试图将值放入“标题”模板中,例如标题和导航链接,但无法访问我从包含的模板发送到主模板的变量。 渲染模板: index.html模板: header.html模板: 显然,它不会那样工作。 也许有一种方法可以解析/获取模板并将变量放入其中,而无需将整个头文件放入代码中?然后,我可以将该模板作为变量发送到我的主模板。但这似乎并不是最好的方法。 问题答案: 您可以在调用模板时将上下文传递给

  • 问题内容: 我最近开始学习Go。我有一个像网络应用程序这样的示例。我有: 我无法加载本地。当我写的时候它被加载了。如何加载本地js文件?我不擅长使用Go编写代码,也没有编写完整的代码。因此,请尝试解释非常简单。提前致谢! 问题答案: 您需要a 或a 来在请求时将文件内容()发送到Web浏览器。 您有3种选择: 手动执行 这是更复杂的解决方案。就像在处理程序函数中,您读取文件的内容,设置适当的响应内