C ++:将未知的union传递给函数作为参数
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C ++:将未知的union传递给函数作为参数相关的知识,希望对你有一定的参考价值。
所以我有这样的事情:
struct FoodType {
union {
int fat = 2;
} Apple;
union {
int fat = 3;
} Banana;
} FoodType;
我想编写一个以“未知”FoodType作为参数的函数。
void eatFood(FoodType type) { /* do something */ }
如何实施?
答案
您在问题中提供的枚举解决方案的替代方法是实例化:
#include <iostream>
struct FoodType {
FoodType(int f) : fat(f) {}
int getFat() { return fat; }
int fat;
};
void eatFood(const FoodType& type) { std::cout << "I ate " << type.getFat() << " grams of fat
"; }
int main() {
FoodType apple(2);
eatFood(apple);
FoodType banana(3);
eatFood(banana);
}
或者,对于更复杂的情况,可以使用多态,但在这里似乎有点矫枉过正:
#include <iostream>
struct FoodType {
virtual int getFat() const = 0;
};
struct Apple: FoodType {
int getFat() const { return 2; }
};
struct Banana: FoodType {
int getFat() const { return 3; }
};
void eatFood(const FoodType& type) { std::cout << "I ate " << type.getFat() << " grams of fat
"; }
int main() {
Apple apple;
eatFood(apple);
Banana banana;
eatFood(banana);
}
另一答案
这就是你要追求的吗?
struct Food {
enum class Type { Apple, Banana };
int fat = 2;
Type type = Apple;
};
您可以在此处指定类型,也可以存储fat
值。
在问题的代码中,有一个union
与一个成员。 union
需要多个成员才有用,成员存储在相同的内存地址中,因此您当时只能使用其中一个成员。两个工会都声明了一个具有相同名称和功能的变量,在我看来,你只需要其中一个。
但是,如果你有一些更复杂的想法,并且你真的需要一个union
,那么你应该尝试这样的事情:
struct Food {
enum class Type { Apple, Banana };
Type type = Apple;
union {
int banana;
double apple;
};
};
Food food;
food.type = Food::Type::Apple;
food.apple = 2;
在这里,你可以使用banana
元素或apple
元素,你可以使用type
元素来知道使用哪一个。
但是如果你需要它,如果你的编译器还不支持它,你最好使用新的std::variant
(或boost :: variant)。
另一答案
从你的评论来看,你想要枚举。 C ++有枚举:
enum FoodType
{
Apple,
Banana
};
void EatFood(const FoodType & foodType)
{
switch (foodType)
{
case Apple:
/* do something */
break;
case Banana:
/* do something */
break;
default:
/* handle invalid value */
break;
}
}
如果需要这些整数值,请执行以下操作:
enum FoodType
{
Apple=2,
Banana=3
};
如果您想要严格打字,请执行以下操作:
enum class FoodType
{
Apple=2,
Banana=3
};
(然后在EatFood中你必须使用FoodType :: Apple和FoodType :: Banana。)
以上是关于C ++:将未知的union传递给函数作为参数的主要内容,如果未能解决你的问题,请参考以下文章