【发布时间】:2015-03-15 13:26:03
【问题描述】:
我想创建一个函数,允许我在参数中使用<< 运算符,并在其中使用相应的字符串流。
类似:
/* 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 '
有错误的行是ss << first; in getStringInner。
我做错了什么?
EDIT2:
我发现了错误。这是工作代码:
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();
}
【问题讨论】:
-
为什么不使用标准的可变参数模板?您将不得不使用逗号,但那又如何?
-
将
ss作为const引用,因为您没有修改它。 -
也许使用
std::ostringstream?First是什么类型的? -
你确实不应该使用
std::stringstream。它支持输入和输出。你只想要输出,所以让std::ostringstream。 -
好的,我会做出改变的。感谢您的建议。
标签: c++ arguments stringstream