将作用域中的枚举作为函数参数传递给另一个作用域

Pass enum in a scope to another as function argument

如何将作用域中的枚举作为函数参数传递给另一个作用域?因为这是失败的:

enum class L;

struct TestClass 
{
   void foo(L n)
   {
      int v = static_cast<int>(n);
      int r[v] = { 9 };
      cout << "\n" << v << "\n";
   }
};


int main() 
{
   enum class L : int 
   {
      A, B, C, D
   };

   TestClass main;
   main.foo(L::D);

   return 0;
}
error: cannot convert ‘main()::L’ to ‘L’
80 | main.foo(L::D);
| ~~~^
|              |
|              main()::L

如何解决这个问题(在确切的位置,而不是将枚举移动到其他范围)?

How to solve this (in the exact place, not move enum to a scope else)?

在作为参数传递时转换枚举。

main.foo(static_cast<int>(L::D));

那么你的成员函数就是

void foo(int n)
{
   std::vector<int> r(n, 9);  // used `std::vector` instead of VLA
   std::cout << "\n" << n << "\n";
}

(See sample code)


请注意,VLA 不是标准 C++ 的一部分。阅读以下 post 中的更多内容: Why aren't variable-length arrays part of the C++ standard?

首选使用 std::vector,如上面的代码示例所示。

简而言之,问题是您有一个要在两个地方使用的枚举。对我来说,最自然的解决方案是将枚举放在它自己的头文件中,并在需要的地方使用它。

// my_enum.h
#pragma once

enum class L : int  {
    A, B, C, D
};

// TestClass.h
#pragma once

// Can forward declare L so long as we define the functions in the same cpp
// If original enum is in a namespace it needs to be forward declared in the same namespace
enum class L;

struct TestClass {
    void foo(L n);
};

// TestClass.cpp
#include "TestClass.h"
#include "my_enum.h"

void TestClass::foo(L n)
{
    // do stuff with n
}

// main.cpp
#include "TestClass.h"
#include "my_enum.h"

int main(){

    TestClass main;
    main.foo(L::D);

    return 0;
}

How to solve this (in exact place, not move enum to a scope else) ?

我知道我以您不希望的方式回答了问题,但我不明白您为什么不想将枚举放入其自己的文件中。避免这种情况会在某些时候导致问题。 JeJo 解决方案的结果是您可以将任何旧整数传递给 foo() - 它基本上与枚举分离。如果整数值应该来自枚举 L:1) 从函数签名来看并不明显,并且 2) 它很容易被滥用,即有人传递了他们不应该传递的值。

如果将枚举放在它自己的头文件中是不可接受的解决方案,我很想知道为什么。