Я довольно новичок в C++ и все еще пытаюсь понять некоторые из тонкостей концепций промежуточного уровня, таких как шаблоны/пишущий общий код. Я пишу приложение, использующее OpenSceneGraph (OSG), и в основном это то, что я пытаюсь сделать:Как ссылаться на переменную без знания определенного типа?
- Я хочу иметь общий класс элемента, который может обрабатывать любое количество различных элементов «типа»
- Каждый экземпляр класса элемента должен содержать другую форму (в зависимости от типа)
- Различные типы элементов (и фигуры, к которым они привязаны) будут обнаружены только во время выполнения, поскольку они зависит от исходных данных - например, может быть 6 разных типов элементов, все из которых представлены ящиками разных размеров. Или могут быть 3 разных типа элементов - одна коробка, один цилиндр, один конус.
Некоторые справочную информацию о OSG, чтобы объяснить источник моего вопроса:
osg::Box
иosg::Cylinder
являются оба видаosg::Shape
- как производные типы имеют одинаковые методы,
getCenter
- даже если вы можно сделать
osg::Shape myShape = osg::Box();
вы не можете сказатьmyShape.getCenter();
- не работает наosg::Shape
объектов.
Вот пример того, что я пытаюсь сделать:
class MyClass {
private:
// ???? How to reference 'shape' ??
public:
MyClass(string _type) {
// This is for example purposes. Eventually types & mappings will be discovered at run-time.
if (_type == "FOO") {
shape = new osg::Box();
} else if (_type == "BAR") {
shape = new osg::Sphere();
}
}
/*
???? How to handle getShape()??
*/
}
int main() {
string readFromData = "FOO";
MyClass* myFoo (readFromData);
string alsoFromData = "BAR";
MyClass* myBar (alsoFromData);
osg::Vec3f fooCenter = myFoo->getShape()->getCenter();
osg::Vec3f barCenter = myBar->getShape()->getCenter();
}
Я пробовал несколько различных подходов, но не вполне был в состоянии работать это:
- , создавая класс
MyShape
, который расширяетosg::Shape
и имеет заголовок виртуальной функции дляgetCenter
, но это делаетMyShape
абстрактным классом, который не может быть создан. template<typedef T> class MyClass...
- но если мы обнаружим только типы отображения & во время выполнения, то что происходит в скобках на всем остальном моем коде? например,MyClass<?????????>* myFoo;
- с использованием boost :: любой для хранения формы внутри - но такой же вопрос в основном. Как вы определяете функцию
getShape
, которая может возвращать указатель на один из нескольких типов?
Я не могу найти никаких предыдущих вопросов, которые касаются этого типа сценариев (извините, если я пропустил один!). Если кто-нибудь может мне помочь, это будет супер круто!
Спасибо @dasblinkenlight! Это похоже на то, что мне нужно. Я дам ему выстрел завтра утром, когда это не 3 часа ночи. :) – user3077634
на самом деле - вопрос о том, может ли CenterFinderVisitor использовать указатели функций (или некоторые другие средства), чтобы быть полностью универсальными, вроде как «сквозные» функции? например поэтому, если бы я хотел сказать 'cf.anything();', он попытался бы выполнить 's.anything();' или 'b.anything();'? Это позволило бы мне создать только один производный класс посетителя, а не получать новый класс посетителей каждый раз, когда я хочу реализовать другую функцию ... – user3077634
@ user3077634 Я не думаю, что вы могли бы это сделать - даже с шаблонами. Возможно, вы могли бы сделать это с помощью макроса, но это было бы сложно поддерживать. Попробуйте это, и дайте мне знать, как это работает. – dasblinkenlight