gpt4 book ai didi

c++ - 传递带有默认值的函数作为忽略它们的参数

转载 作者:太空狗 更新时间:2023-10-29 19:56:34 24 4
gpt4 key购买 nike

我需要将表示 T vector 的字符串转换为相应的 vector 。

我的问题是我想传递一个简单的参数:转换器函数。这是拆分:

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 的默认参数是 int stoi,因此在传递标准函数(如 std::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); });

是否有元编程技巧可以让我以某种方式忽略默认参数?

最佳答案

编辑:这在这种情况下实际上没有帮助。我离开它是因为它在其他一些情况下很有用,例如如果您有一个返回可转换为 T 的函数,但它没有解决 stoi< 的任何问题.


不要明确指定函数的类型。设convert为任意类型;如果您尝试传递无法在 std::string 上调用的内容,或者不会返回可转换为 T 的内容,则会出现错误。没有理由将类型限制在该范围之外,除非您特别有理由将其限制为该特定类型,而在这种情况下您不需要。

因此,您可以将函数声明为

template <class T, class F>
auto split(const std::string &s, const F&& convert, char sep = ',') -> std::vector<T>

关于c++ - 传递带有默认值的函数作为忽略它们的参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46587694/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com