所以我在这里简化了我要做的事情,但是基本上我有一个看起来像这样的函数:
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
。
也许这是不可能的,如果可以的话,请给我一个有关如何执行此操作的建议。
...
如果有人在想,我正在写翻译。
答案 0 :(得分:3)
您可以使用功能模板来实现。
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功能),但是不需要后者。
答案 1 :(得分:1)
不确定为什么这个问题被否决,因为这在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;
// ...
}