我想创建一个允许我使用 <<
的函数参数中的运算符及其内部使用相应的字符串流。
类似于:
/* 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/