C++:如何获取函数以接受来自任何名称空间的具有相同 class 名称的对象?
C++: How to get function to accept an object with same class name from any namespace?
MainClass.h:
namespace Alpha{ enum class Parameters; }
namespace Beta { enum class Parameters; }
MainClass{
public:
enum class Type{ Type_A, Type_B };
MainClass(const Type t);
void DoStuff(const Parameters p);
private:
void doesStuff(const int p_val);
};
MainClass.cpp:
/* define values for Alpha::Parameters, Beta::Parameters here or elsewhere, and included */
MainClass::MainClass(const Type t){
/* not sure how to do this. But essentially by switching based on 't' use either Alpha::Parameters or Beta::Parameters */
}
MainClass::DoStuff(const Parameters p){
int p_value = static_cast<int>(p);
doesStuff(p_value);
}
这就是我希望能够做到的。这可能吗?实际上,如果 enum class 表现得像具有继承的 class 就好了,但我知道我不能那样做。我尝试重写它的次数越多,它就一直螺旋上升,直到我实际上不得不为每种情况编写特定的 classes(我在示例中不仅有两个)。但是代码非常相似,真的。
我也知道另一种方法是让 DoStuff(const Parameters p) 只是一个 DoStuff(const int p_val) 并在外部进行静态转换...但是我必须在其他地方进行所有静态转换,而且我没有得到很好的枚举类型检查 class.
如果不可能,那很好......但如果是这样就太糟糕了。
你试过模板了吗?
class Main {
template < typename PARAMETERS >
void DoStuff(const PARAMETERS p) {
doesStuff(static_cast<int>(p));
}
}
然后您可以根据需要为每个参数类型提供专业化。
我错过了关于确定构造函数中哪个 T 的第一部分。通常我会使用 class 模板来实现它,如下所示:
#include <iostream>
namespace Alpha{ enum class Parameters { A, B, C }; }
namespace Beta { enum class Parameters { a, b, c }; }
template < typename P >
class MainClass{
public:
MainClass() { }
void DoStuff(const P p) {
int p_value = static_cast< int >(p);
doesStuff(p_value);
}
private:
void doesStuff(const int p_val) {
std::cout << "DoesStuff " << p_val << std::endl;
}
};
int main(int argc, const char** argv) {
MainClass< Alpha::Parameters > alpha;
alpha.DoStuff(Alpha::Parameters::A);
alpha.DoStuff(Alpha::Parameters::B);
alpha.DoStuff(Alpha::Parameters::C);
MainClass< Beta::Parameters > beta;
beta.DoStuff(Beta::Parameters::a);
beta.DoStuff(Beta::Parameters::b);
beta.DoStuff(Beta::Parameters::c);
return 0;
}
但是,如果 DoStuff 是唯一依赖于使用哪些参数的部分,我会使用模板函数。
您可以通过函数重载和最少的函数体代码来完成此操作。
MainClass::DoStuff(Alpha::Parameters p){
int p_value = static_cast<int>(p);
doesStuff(p_value);
}
MainClass::DoStuff(Beta::Parameters p){
int p_value = static_cast<int>(p);
doesStuff(p_value);
}
MainClass::DoStuff(Etcetera::Parameters p){
int p_value = static_cast<int>(p);
doesStuff(p_value);
}
所有的实现都在 doesStuff()
函数中。
这仍然允许您保留使用不同枚举的现有函数调用。
但是,此类型检查可能没有您想象的那么有价值...此代码假定所有枚举都将保持相同。如果您只更改其中一个(例如 Beta::Parameters 枚举),它将破坏此代码,并且您将在没有任何警告的情况下引入错误。
MainClass.h:
namespace Alpha{ enum class Parameters; }
namespace Beta { enum class Parameters; }
MainClass{
public:
enum class Type{ Type_A, Type_B };
MainClass(const Type t);
void DoStuff(const Parameters p);
private:
void doesStuff(const int p_val);
};
MainClass.cpp:
/* define values for Alpha::Parameters, Beta::Parameters here or elsewhere, and included */
MainClass::MainClass(const Type t){
/* not sure how to do this. But essentially by switching based on 't' use either Alpha::Parameters or Beta::Parameters */
}
MainClass::DoStuff(const Parameters p){
int p_value = static_cast<int>(p);
doesStuff(p_value);
}
这就是我希望能够做到的。这可能吗?实际上,如果 enum class 表现得像具有继承的 class 就好了,但我知道我不能那样做。我尝试重写它的次数越多,它就一直螺旋上升,直到我实际上不得不为每种情况编写特定的 classes(我在示例中不仅有两个)。但是代码非常相似,真的。
我也知道另一种方法是让 DoStuff(const Parameters p) 只是一个 DoStuff(const int p_val) 并在外部进行静态转换...但是我必须在其他地方进行所有静态转换,而且我没有得到很好的枚举类型检查 class.
如果不可能,那很好......但如果是这样就太糟糕了。
你试过模板了吗?
class Main {
template < typename PARAMETERS >
void DoStuff(const PARAMETERS p) {
doesStuff(static_cast<int>(p));
}
}
然后您可以根据需要为每个参数类型提供专业化。
我错过了关于确定构造函数中哪个 T 的第一部分。通常我会使用 class 模板来实现它,如下所示:
#include <iostream>
namespace Alpha{ enum class Parameters { A, B, C }; }
namespace Beta { enum class Parameters { a, b, c }; }
template < typename P >
class MainClass{
public:
MainClass() { }
void DoStuff(const P p) {
int p_value = static_cast< int >(p);
doesStuff(p_value);
}
private:
void doesStuff(const int p_val) {
std::cout << "DoesStuff " << p_val << std::endl;
}
};
int main(int argc, const char** argv) {
MainClass< Alpha::Parameters > alpha;
alpha.DoStuff(Alpha::Parameters::A);
alpha.DoStuff(Alpha::Parameters::B);
alpha.DoStuff(Alpha::Parameters::C);
MainClass< Beta::Parameters > beta;
beta.DoStuff(Beta::Parameters::a);
beta.DoStuff(Beta::Parameters::b);
beta.DoStuff(Beta::Parameters::c);
return 0;
}
但是,如果 DoStuff 是唯一依赖于使用哪些参数的部分,我会使用模板函数。
您可以通过函数重载和最少的函数体代码来完成此操作。
MainClass::DoStuff(Alpha::Parameters p){
int p_value = static_cast<int>(p);
doesStuff(p_value);
}
MainClass::DoStuff(Beta::Parameters p){
int p_value = static_cast<int>(p);
doesStuff(p_value);
}
MainClass::DoStuff(Etcetera::Parameters p){
int p_value = static_cast<int>(p);
doesStuff(p_value);
}
所有的实现都在 doesStuff()
函数中。
这仍然允许您保留使用不同枚举的现有函数调用。
但是,此类型检查可能没有您想象的那么有价值...此代码假定所有枚举都将保持相同。如果您只更改其中一个(例如 Beta::Parameters 枚举),它将破坏此代码,并且您将在没有任何警告的情况下引入错误。