I have several std::unordered_maps
. They all have an std::string
as their key and their data differs. I want to make a csv string from a given map\'s k
As in C++14 auto
parameters are only allowed in lambdas (as per @ildjarn's comment), you can just develop a function template, templateized on the map type, e.g.:
#include <sstream>
#include <string>
#include <vector>
class myClass {
...
template <typename MapType>
std::string getCollection(const MapType& myMap) {
std::vector <std::string> tmpVec;
for ( const auto& elem : myMap) {
tmpVec.push_back(elem.first);
}
std::stringstream ss;
for ( const auto& elem : tmpVec ) {
ss << elem <<',';
}
std::string result=ss.str();
result.pop_back(); //remove the last ','
return result;
}
Note also the addition of const
for some const-correctness.
Moreover, why not just building the output string directly using the string stream object, without populating an intermediate vector<string>
(which is more code, more potential for bugs, more overhead, less efficiency)?
And, since you are just interested in using the string stream as an output stream, using ostringstream
instead of stringstream
is better as it's more efficient and communicates your intent better.
#include <sstream> // for std::ostringstream
#include <string> // for std::string
...
template <typename MapType>
std::string getCollection(const MapType& myMap) {
std::ostringstream ss;
for (const auto& elem : myMap) {
ss << elem.first << ',';
}
std::string result = ss.str();
result.pop_back(); // remove the last ','
return result;
}
Why not just use a template?
template <typename TMap>
std::string myClass::GetCollection(TMap &myMap) {
std::vector <std::string> tmpVec;
for ( auto& elem : myMap) {
tmpVec.push_back(elem.first);
}
std::stringstream ss;
for ( auto& elem : tmpVec ) {
ss << elem <<',';
}
std::string result=ss.str();
result.pop_back(); //remove the last ','
return result;
}
Your method is exactly the same, but instead of the auto
keyword, we use template function syntax to handle the type inference.
auto
parameters are only allowed in lambdas in C++14.
Probably this is since in an classic function like yours you could have declared a function template (which is basically what happens in the lambda case) while lambdas can't be templates.