是否有一种模式可以从C++中的另一个枚举继承枚举?
像这样的东西:
enum eBase
{
one=1, two, three
};
enum eDerived: public eBase
{
four=4, five, six
};
Run Code Online (Sandbox Code Playgroud) 我正在尝试存储和操作具有不同参数类型的模板类对象列表; 模板类有两个parametrised方法,一个返回参数类型和一个空隙一个接受它作为输入.
更具体地说,我有一个模板类,定义如下:
template<typename T>
class Test
{
public:
virtual T a() = 0;
virtual void b(T t) = 0;
};
Run Code Online (Sandbox Code Playgroud)
和它的不同规格,如:
class TestInt : public Test<int>
{
public:
int a() {
return 1;
}
void b(int t) {
std::cout << t << std::endl;
}
};
class TestString : public Test<std::string>
{
public:
std::string a() {
return "test";
}
void b(std::string t) {
std::cout << t << std::endl;
}
};
Run Code Online (Sandbox Code Playgroud)
我希望能够在一个列表中存储两者的不同对象TestInt并TestString键入并循环调用一个方法作为另一个方法的输入,如:
for (auto it …Run Code Online (Sandbox Code Playgroud) 我知道不能在 C++ 中使用虚拟方法的模板(反之亦然),例如这里和这里讨论的。不幸的是,在我的情况下,我不确定如何处理该限制。
我们有一个包含方法模板的类模板:
template <class T>
class BeliefSet : public Belief<T>
{
private:
std::vector<T> m_Facts;
public:
template <class Iter>
void SetFacts(Iter IterBegin, Iter IterEnd, bool Append = false)
{
if(!Append)
{
m_Facts.clear();
}
m_Facts.insert(m_Facts.end(), IterBegin, IterEnd);
}
};
Run Code Online (Sandbox Code Playgroud)
该方法SetFacts()应该能够为 STL 容器接收两个输入迭代器,这就是我们在这里使用方法模板的原因。
现在我想让这个方法成为SetFacts()虚拟的,这在 C++ 中是不可能的,目前编写这段代码的方式。那么处理这种情况的典型方法是什么?
我有一个类层次结构,我想引入一个方法模板,就像它是虚拟的一样.例如一个简单的层次结构:
class A {
virtual ~A() {}
template<typename T>
void method(T &t) {}
};
class B : public A {
template<typename T>
void method(T &t) {}
};
Run Code Online (Sandbox Code Playgroud)
然后我创建对象B:
A *a = new B();
Run Code Online (Sandbox Code Playgroud)
我知道我可以获取存储在类型a的typeid(a).B::method当我知道类型时,如何动态调用正确的?我可能有这样的情况:
if(typeid(*a)==typeid(B))
static_cast<B*>(a)->method(params);
Run Code Online (Sandbox Code Playgroud)
但我想避免有这样的条件.我正在考虑创建一个std::mapwith typeid作为一个键,但我会把它作为一个值?