РассмотримАдресности типа с использованием ключевого слова в производных классах
struct AbstractClass {};
struct Derived1 : AbstractClass {
using type = int;
};
struct Derived2 : AbstractClass {
using type = char;
};
struct Derived3 : AbstractClass {
using type = bool;
};
int main() {
AbstractClass* a[] = {new Derived1, new Derived2, new Derived3};
}
Как получить type
от а [0], а [1], а [2]?
Вот что я пытаюсь выполнить. Наверное, нет другого способа сделать это, чем это?
#include <iostream>
struct Object { virtual ~Object() = default; };
struct A : Object {};
struct B : Object {};
struct C : Object {};
struct AbstractClass {
virtual void take (Object*) {
std::cout << "Accepted.\n";
}
};
template <typename...> struct ObjectTypes;
template <typename First, typename... Rest>
struct ObjectTypes<First, Rest...> : ObjectTypes<Rest...> {
bool operator()(Object* o) const {
if (dynamic_cast<First*>(o))
return true;
return ObjectTypes<Rest...>::operator()(o);
}
};
template <>
struct ObjectTypes<> {
bool operator()(Object*) const {return false;}
};
struct Derived1 : AbstractClass {
using type = ObjectTypes<A,B>;
virtual void take (Object* o) override {
if (type()(o)) // This is why I want to use type from AbstractClass.
return AbstractClass::take(o);
std::cout << "Rejected.\n";
}
};
struct Derived2 : AbstractClass {
using type = ObjectTypes<A,C>;
virtual void take (Object* o) override {
if (type()(o))
return AbstractClass::take(o);
std::cout << "Rejected.\n";
}
};
struct Derived3 : AbstractClass {
using type = ObjectTypes<B,C>;
virtual void take (Object* o) override {
if (type()(o))
return AbstractClass::take(o);
std::cout << "Rejected.\n";
}
};
int main() {
AbstractClass* abs[] = {new Derived1, new Derived2, new Derived3};
A* a = new A;
B* b = new B;
C* c = new C;
for (AbstractClass* x : abs) {
x->take(a);
x->take(b);
x->take(c);
std::cout << "------------\n";
}
}
Обратите внимание на повторения в Derived1, Derived2, Derived3 и т. Д.?? Поэтому моя первоначальная цель состояла в том, чтобы все это было сделано в базовом классе AbstractClass.
Вы не можете. Типы должны быть известны во время компиляции. Если вы объясните, что вы на самом деле пытаетесь сделать, мы сможем помочь вам найти решение. – Brian
@Brian. Предположим, что у меня есть 'AbstractClass * a'. Поскольку AbstractCass является абстрактным, '' a' имеет 'type', и мне нужно его использовать. – prestokeys
Нет, я имею в виду более широко, для чего это будет использоваться? – Brian