c++ - 在函数参数中使用 << 运算符

标签 c++ arguments stringstream

我想创建一个允许我使用 << 的函数参数中的运算符及其内部使用相应的字符串流。

类似于:

/* This does not do what i want below */
void printStream(std::stringstream& ss) {
  std::cout << ss.str();
}

/* Desired function usage */
printStream("The number is: " << 42 << ".");

我应该在函数声明中使用什么?

编辑:

按照 Deduplicator 的建议,我正在尝试使用可变参数模板。出于我的目的,我决定创建一个模板,该模板采用参数列表并返回组合字符串。

这是代码:

template <typename First, typename... Rest> void getStringInner(std::stringstream& ss, const First& first, const Rest&... rest) {
  ss << first;
  getStringInner(ss, rest...);
}

template <typename First, typename... Rest> std::string getString(const First& first, const Rest&... rest) {
  std::stringstream ss;
  getStringInner(ss, first, rest...);
  return ss.str();
}

不幸的是,Visual Studio 给我一个错误:

error C2678: binary '<<' : no operator found which takes a left-hand operand of type 'std::stringstream' (or there is no acceptable conversion) main.cpp 42 Test

错误的行是ss << first;getStringInner .

我做错了什么?

编辑 2:

我发现了错误。这是工作代码:

template <typename First> void getStringInner(std::stringstream& ss) {}

template <typename First> void getStringInner(std::stringstream& ss, const First& first) {
  ss << first;
}

template <typename First, typename... Rest> void getStringInner(std::stringstream& ss, const First& first, const Rest&... rest) {
  ss << first;
  getStringInner(ss, rest...);
}

template <typename First, typename... Rest> std::string getString(const First& first, const Rest&... rest) {
  std::stringstream ss;
  getStringInner(ss, first, rest...);
  return ss.str();
}

最佳答案

不要那样做,它需要预处理器破解。

只需使用可变模板和逗号而不是左移:

template<class... X> void printStream(X&&... x) {
    std::stringstream ss;
    ((void)0, (void)(ss<<x), ...);
    std::cout << ss.rdbuf();
}

关于c++ - 在函数参数中使用 << 运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29061108/

相关文章:

c++ - 使用 DX 缩放对象

c++ - 如何在方法中使用 vector 和结构成员

c++ - 方法调用的括号

c++ - 在 C++ 中使用指针会减少运行时间?

c++ - 如何让这个音频延迟工作?

python - 如何打印出 Python 函数需要/允许哪些参数?

arguments - Swift:通过引用传递原语的用例是什么

c - 分配给函数的参数太多?

c++ - 忽略来自 stringstream 的值(比如 sscanf 中的 %*f)

c++ - 读取具有任意数量空格的输入字符串的一部分