gpt4 book ai didi

C++实现基于运行时类型的转换

转载 作者:行者123 更新时间:2023-11-30 03:44:26 24 4
gpt4 key购买 nike

我是 c++ 的新手,我最近决定编写一个小计算器来练习。我希望计算器也能够对整数和 float (以及后来的不同数据类型,例如复数)进行运算,但是在尝试决定如何进行转换时遇到了问题。假设用户想要对一个整数和一个 float 执行操作。在这种情况下,我希望将整数转换为 float (这是一个相对简单的示例,一旦我实现了更多类型,这将变得更加复杂)。我试过使用函数签名模板,但这对我没有帮助:

template <class T> T add(T a, T b);
//...

//Operation is an enum
//data is a structure comprised of a union and an enum to decide which union member is used
void execute_operation(Operation op, data operand0, data operand1) {
switch (op) {
case Addition:
//is operand0 or operand1 float? cast both to float : keep them as integers
//also, decide on the cast made which union member of result to use
data result = add(operand0.value, operand1.value);
break;
}
}

到目前为止,我提出的唯一解决方案是对一种转换表进行硬编码,但我很确定一定有更好的解决方案。我过去曾使用过 ruby​​ 和其他一些语言,这些语言对类型有更动态的方法,所以我可能不是“思考 c++”。任何帮助将不胜感激。

最佳答案

您可以使用两个不同的模板参数来代替强制转换,让编译器为您进行隐式强制转换。以这个小例子为例

template<typename T, typename U>
auto Add(T lhs, U rhs) -> decltype(lhs + rhs)
{
return lhs + rhs;
}

int main()
{
std::cout << typeid(Add(1, .5f)).name() << std::endl;
std::cout << typeid(Add(1, .5)).name() << std::endl;
std::cout << typeid(Add(1, 3)).name() << std::endl;
std::cout << typeid(Add(1.0f, .5f)).name() << std::endl;
std::cout << typeid(Add(1.0, .5f)).name() << std::endl;
}

输出

f
d
i
f
d

Live Example

如您所见,当其中一种类型大于另一种类型时,编译器将为您转换。

关于C++实现基于运行时类型的转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35482011/

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