C ++:将未知的union传递给函数作为参数

时间:2018-01-11 14:20:28

标签: c++ struct unions

所以我有这样的事情:

struct FoodType {
    union {
        int fat = 2;
    } Apple;
    union {
        int fat = 3;
    } Banana;
} FoodType;

我想编写一个带有"未知" FoodType作为参数。

void eatFood(FoodType type) { /* do something */ }

如何实施?

3 个答案:

答案 0 :(得分:2)

您在问题中提供的枚举解决方案的替代方法是实例化:

#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\n"; }

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\n"; }

int main() {
    Apple apple;
    eatFood(apple);
    Banana banana;
    eatFood(banana);
}

答案 1 :(得分:1)

这是你之后的事吗?

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)。

答案 2 :(得分:1)

根据您的评论判断,您需要枚举。 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。)