【问题标题】:Data type for std::string or std::endlstd::string 或 std::endl 的数据类型
【发布时间】:2021-07-12 22:24:23
【问题描述】:

我有以下函数模板:

#ifndef FUNCTIONS_H
#define FUNCTIONS_H

#include <iostream>
#include <string>
#include <vector>

template <typename Streamable>
void printall(std::vector<Streamable>& items, std::string sep = "\n")
{
    for (Streamable item : items)
        std::cout << item << sep;
}

#endif

现在我想将sep 的默认值设置为std::endl,这是一个函数,而不是std::string。 但我也希望用户能够传入std::string。 我必须如何指定参数sep 的类型以同时接受任意std::stringstd::endl

【问题讨论】:

  • 您应该使用与std::endl 声明中使用的相同类型。但是,您所拥有的实施究竟让您感到困扰的是什么?!?
  • std::endl 是一个函数,它输出\n,然后在流上调用flush()。为什么要在每个项目之后刷新?如果你想刷新,在循环之后执行一次是有意义的。
  • 如果你坚持:template &lt;typename Streamable, typename Sep = decltype(std::endl&lt;char, std::char_traits&lt;char&gt;&gt;)&gt; void printall(std::vector&lt;Streamable&gt;&amp; items, Sep sep = std::endl)Demo。这接受任何可以写入std::cout(不仅仅是字符串和std::endl)的分隔符
  • 谢谢。我读了这个,因为它只能通过扩展模板来工作。现在我确信,我不想那样做。
  • 你也可以写两个重载,一个接受一个参数并使用std::endl,一个接受两个参数,第二个是std::string,没有默认参数。

标签: c++ string types c++17 endl


【解决方案1】:

如果您希望第二个参数的默认值为std::endl,那么您可以简单地添加一个只接受一个参数的重载,并且不要为string 重载提供默认值。这将为您提供所需的重载集。

template <typename Streamable>
void printall(std::vector<Streamable>const & items)  // gets called when second 
                                                     // argument is not passed in
{
    for (Streamable const & item : items)
        std::cout << item << std::endl;
}

template <typename Streamable>
void printall(std::vector<Streamable> const & items, std::string const & sep)
{
    for (Streamable const & item : items)
        std::cout << item << sep;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-01-08
    • 1970-01-01
    • 2010-11-11
    • 2018-11-15
    • 2015-04-19
    • 1970-01-01
    相关资源
    最近更新 更多