2016-11-23 52 views
1

我在这里是新的,这是我的第一个问题。Initializer_list作为函数参数和循环功能

所以,我有这样的功能:

std::string join(string_initializer_list p_input) const { 
    std::string output; 
    for (auto const & s : p_input) { 
     output.append(s); 
    } 
    return output; 
} 

该功能的主要目的是参加字符串返回一个新的字符串列表。

对于参数我使用了std::initializer_list<std::string>别名为string_initializer_list

该参数是按值传递的,因为在做了一些研究之后,我注意到我只是传递指针而已,这是最习惯和正确的方式。

我的问题与for循环有关:在这种情况下哪个更正确?为什么?我应该使用auto const &还是auto &&

问题是:我不想更改initializer_list中的任何字符串,我想清楚地说明。从这个角度来看,const &似乎更正确,但我想知道你对这件事的看法。

在做了一些研究后,用C++进行测试并阅读了很多问题,但我还没有完全理解auto &&的工作原理。

此外,在第一份草案中,我还将参数作为&&传递,以防止它成为左值。

我只打算使用此功能快速这样的东西:

join({"Hello, ", "world"}); 

在极少数ocasions,其中一个std::string S的最终会被一个左:

join({"Hello, ", some_string}); 

主要概念这里是制作串联字符串的便宜而简单的方法。这是我做的另一个功能,与上面的类似,但是用于不同的上下文。

std::string & concatenate(std::string & p_output, string_initializer_list p_input) const { 
    for (auto const & s : p_input) { 
     p_output.append(s); 
    } 
    return p_output; 
} 

再一次,我的完美主义者问的是循环。

+0

你可能想在你的函数中考虑几件事情。一种可能是你可能首先要计算长度的总和,然后在填充之前构造一个大小的字符串。至于循环。因为底层对象类型的类型是const字符串,因此对于通用引用的类型推导应该产生const字符串,并且与const auto&would相同,因此在事务的大方案中使用const auto&或auto &&并不重要。 (更有效的函数可能实际上是使用可变参数模板来完成工作而不是循环的函数。) – Charlie

+0

谢谢!我是否应该使用另一个循环来计算最终长度,然后在最后一个字符串上调用保留?另一个循环会不会太多?我的意思是,我明白你的观点。我知道可变模板的事情,模板解决方案的问题是,它们应该是通用的,在我的情况下,我只想要一些可以在字符串上工作的东西,还有许多用于字符串连接的可变参数模板实现使用ostringstream来确保大多数东西变成了一个字符串。 –

回答

1

迭代器类型std::initializer_list<T>const T*。所以当你解除引用时,你会得到一个类型为const T的左值。无论您是使用const auto&还是auto&&进行迭代都无关紧要,因为无论哪种方式,您都会得到左值为const T的左值。我更喜欢const auto&这里为可读性--- auto&&经常表明你正在使用模板代码,其中的东西可以是左值或右值。

+0

感谢您的回应;) –