gpt4 book ai didi

c++ - 我如何为 std::string 专门化我的模板

转载 作者:行者123 更新时间:2023-11-27 22:34:58 24 4
gpt4 key购买 nike

我有以下模板化函数

template <typename As, typename std::enable_if<
std::is_arithmetic<As>::value, As>::type* = nullptr >
As getStringAs(const std::string& arg_name)
{
std::istringstream istr(arg_name);
As val;
istr >> val;
if (istr.fail())
throw std::invalid_argument(arg_name);
return val;
}

我想像这样使用它:

getStringAs<float>("2.f");

什么是专门针对 std::string 的函数的好方法?这样我就可以写

getStringAs<std::string>("2.f");

我已经尝试了所有已知的方法,但由于 std::enable_if 的默认类型产生的歧义,它们似乎都失败了.例如:如果我写:

template<>
std::string getStringAs<std::string>(const std::string& arg_name)
{
}

这不会匹配任何模板重载。如果我添加第二种类型,这将产生歧义错误。我试过 google-in,但我唯一能找到的是关于标签分派(dispatch)的,但这会使用户端的调用变得丑陋。我在考虑使用宏定义替换 getStringAs<std::string> 的非常丑陋的解决方案带有发货标签。

谢谢!

最佳答案

我通常使用函数重载来解决此类问题。它允许您轻松地为更多类型扩展函数,并且您只需要在必要时使用 SFINAE(例如,对于 std::is_arithmetic)。由于您不能按返回类型重载,因此仅当您将结果存储在其中一个参数中时才有效。

template <typename T>
typename std::enable_if<std::is_arithmetic<T>::value>::type
getStringAsImpl(std::string const& in, T& out)
{
std::istringstream sstr(in);
sstr >> out;
if (sstr.fail())
{
throw std::invalid_argument(in);
}
}

void getStringAsImpl(std::string const& in, std::string& out)
{
out = in;
}

template <typename T>
T getStringAs(std::string const& in)
{
T out;
getStringAsImpl(in, out);
return out;
}

关于c++ - 我如何为 std::string 专门化我的模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55859186/

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