我需要将表示 T
向量的字符串转换为相应的向量。
我的问题是,我想传递一个简单的参数:转换函数。这里是 split
:
template <class T>
auto split(const std::string &s, const std::function<T(const std::string&)> &convert, char sep = ',') -> std::vector<T>
{
std::stringstream ss(s);
std::vector<T> result;
while (ss.good())
{
std::string substr;
std::getline(ss, substr, sep);
if (!substr.empty())
result.push_back(convert(substr));
}
return result;
};
当传递标准函数,例如std::stoi
时,由于std::stoi
的默认参数,编译会失败。因为它的签名是int stoi(const string& __str, size_t* __idx = 0, int __base = 10);
:
auto q = split<int>(subs, std::stoi);
error: no matching function for call to 'split'
auto q = split<int>(subs, std::stoi);
^~~~~~~~~~
显然,我可以通过使用lambda函数来欺骗编译器:
auto q = split<std::size_t>(subs, [](const std::string &s){ return std::stoul(s); });
有没有元编程的技巧可以让我以某种方式 忽略 默认参数?
split<int>
。 - nwpstd::stoi
有默认参数:签名为int stoi(const string& __str, size_t* __idx = 0, int __base = 10);
。我希望忽略这个默认签名。 - senseiwa