返回string,float或int的C ++函数
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了返回string,float或int的C ++函数相关的知识,希望对你有一定的参考价值。
所以我简化了我在这里尝试做的事情,但基本上我有一个看起来像这样的函数:
int perform_operation(int left, std::string op, int right) {
if (op == "+")
return left + right;
if (op == "-")
return left - right;
...
};
我希望这个函数能够将float
,int
和string
作为左右参数。如果传入字符串并使用+
运算符,则应该连接字符串,如果运算符不支持字符串,则应该抛出错误。
我也希望该函数能够返回float
,int
和string
。
也许这是不可能的,如果是这样,请给我一个关于如何做到这一点的建议。
...
如果有人在想,我正在写一名翻译。
您可以使用功能模板实现此目的。
template<class T>
T perform_operation(const T& left, std::string_view op, const T& right)
{
if (op == "+")
return left + right;
if (op == "-")
return left - right;
// ...
}
现在由于std::string
不支持operator -
并且您希望操作引发错误,因此您需要专门化此类型的模板:
template<>
std::string perform_operation<std::string>(const std::string& left, std::string_view op, const std::string& right)
{
if (op == "+")
return left + right;
throw std::invalid_argument("std::string supports operator + only");
}
这可以像下面这样实例化和调用。
const int result1 = perform_operation(1, "+", 2);
const float result2 = perform_operation(2.f, "-", 3.f);
const std::string result3 = perform_operation<std::string>("hello", "+", " world");
assert(result1 == 3);
assert(std::abs(result2 + 1.0f) < std::numeric_limits<float>::epsilon()));
assert(result3 == "hello world");
请注意,我已将参数类型更改为接受操作数作为const
限定引用,操作符作为std::string_view
(C ++ 17特性),但后者不是必需的。
不确定为什么这个问题被低估了,因为这在C ++中非常有意义。
你需要的是一个template
。具体来说,是功能模板。
template <typename T>
T perform_operation(T left, std::string op, T right) {
if (op == "+")
return left + right;
if (op == "-")
return left - right;
// ...
}
当然,模板没有operator-
,所以你可以使用重载:
std::string perform_operation(std::string left, std::string op, std::string right) {
if (op == "+")
return left + right;
// ...
}
以上是关于返回string,float或int的C ++函数的主要内容,如果未能解决你的问题,请参考以下文章
C语言试题二十九之编写函数int function(int lim,int aa[max])求出小于或等于lim的所有素数并放在aa数组中,该函数返回所求的素数的个数。
C语言试题二十九之编写函数int function(int lim,int aa[max])求出小于或等于lim的所有素数并放在aa数组中,该函数返回所求的素数的个数。