将作用域中的枚举作为函数参数传递给另一个作用域
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";
}
请注意,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) 它很容易被滥用,即有人传递了他们不应该传递的值。
如果将枚举放在它自己的头文件中是不可接受的解决方案,我很想知道为什么。
如何将作用域中的枚举作为函数参数传递给另一个作用域?因为这是失败的:
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";
}
请注意,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) 它很容易被滥用,即有人传递了他们不应该传递的值。
如果将枚举放在它自己的头文件中是不可接受的解决方案,我很想知道为什么。