C++ 减少向函数传递参数所需的stringstream操作的冗长性

C++ 减少向函数传递参数所需的stringstream操作的冗长性,c++,string,stringstream,C++,String,Stringstream,给定以下代码: #include <string> #include <sstream> int add(int a, int b) { return a + b; } int main() { std::string str = "1 2"; std::stringstream ss(str); int a, b; ss >> a; ss >> b; printf("Result: %d\n", add(a, b

给定以下代码:

#include <string>
#include <sstream>

int add(int a, int b) {
  return a + b;
}

int main() {
  std::string str = "1 2";
  std::stringstream ss(str);

  int a, b;
  ss >> a;
  ss >> b;
  printf("Result: %d\n", add(a, b));
}
并减少添加到以下内容中的调用:

add(ss >> ?, ss >> ?) // ? because I don't know what'd you'd put there.

基本上,把它变成一行。

你的意思是这样的

int sum( istream & is ) {
     int n, total = 0;
     while( is >> n ) {
          total += n;
     }
     return total;
}

你是说像这样的

int sum( istream & is ) {
     int n, total = 0;
     while( is >> n ) {
          total += n;
     }
     return total;
}

您可以创建一个函数

int getInt(std::istream& instr)
{
   int n;
   instr >> n;
   return n;
}
然后使用

printf("Result: %d\n", add(getInt(ss), getInt(ss)));
PS

如果
add
参数的求值顺序很重要,那么这种方法将不起作用。例如,您不能使用:

printf("Result: %d\n", subtract(getInt(ss), getInt(ss)));
其中
subtract
具有通常的含义

当然,您可以使用:

int a = getInt(ss);
int b = getInt(ss);
printf("Result: %d\n", add(a, b));
printf("Result: %d\n", subtract(a, b));

您可以创建一个函数

int getInt(std::istream& instr)
{
   int n;
   instr >> n;
   return n;
}
然后使用

printf("Result: %d\n", add(getInt(ss), getInt(ss)));
PS

如果
add
参数的求值顺序很重要,那么这种方法将不起作用。例如,您不能使用:

printf("Result: %d\n", subtract(getInt(ss), getInt(ss)));
其中
subtract
具有通常的含义

当然,您可以使用:

int a = getInt(ss);
int b = getInt(ss);
printf("Result: %d\n", add(a, b));
printf("Result: %d\n", subtract(a, b));

您可以定义一个重载方法,如:

int add(const std::string & str ) 
{
    std::stringstream ss(str); 
    int a, b,sum; 
    ss >> a; ss >> b;
    return add(a, b);
}

您可以定义一个重载方法,如:

int add(const std::string & str ) 
{
    std::stringstream ss(str); 
    int a, b,sum; 
    ss >> a; ss >> b;
    return add(a, b);
}

就我理解你的问题而言,你想知道是否有一种方法可以减少

int a, b;
ss >> a >> b;
cout << (a + b) << endl;

就我理解你的问题而言,你想知道是否有一种方法可以减少

int a, b;
ss >> a >> b;
cout << (a + b) << endl;

ss>>a>>b请注意,即使您按照自己的意愿创建函数,参数求值的顺序也未指定。(当然,这对sum来说不是问题:)@AlexD很高兴知道…似乎没有办法避免像我希望的那样声明变量…我不认为有,但我希望这只是因为缺乏经验。你仍然可以创建一个函数
int-getInt(stringstream)
并编写
int a=getInt(ss),b=getInt(ss)ss>>a>>b
更为惯用。您正处于编写解析器的早期阶段。对这种语法大惊小怪还为时过早。随着代码的形成,您可能会有更大的事情要做。听从AlexD的建议,尽量减少你正在做的事情,然后当你看到更大的东西的形状时,你可以相应地构建它请注意,即使您按照自己的意愿创建函数,参数求值的顺序也未指定。(当然,这对sum来说不是问题:)@AlexD很高兴知道…似乎没有办法避免像我希望的那样声明变量…我不认为有,但我希望这只是因为缺乏经验。你仍然可以创建一个函数
int-getInt(stringstream)
并编写
int a=getInt(ss),b=getInt(ss)ss>>a>>b
更为惯用。您正处于编写解析器的早期阶段。对这种语法大惊小怪还为时过早。随着代码的形成,您可能会有更大的事情要做。采纳AlexD的建议,尽量减少你正在做的事情,然后当你看到更大的东西的形状时,你就可以相应地构建它。不,很遗憾。我只用sum作为我的名字。我的问题只是围绕语法的糖分,以及如何减少冗长。@AR7那么,至少对我来说,你的问题是什么还不清楚。不,很遗憾。我只用sum作为我的名字。我的问题只是围绕语法的糖分,以及如何减少冗长。@AR7那么,至少对我来说,你的问题是什么还不清楚。@AlexD,你提出了一个正确的观点。我将等待下层选民改变主意:):)从技术上讲,正如你所写的,因为顺序并不重要。@AlexD,你提出了一个正确的观点。我将等待下层选民改变主意:):)从技术上讲,正如你已经写的,因为顺序并不重要。