c ++ Список классов без инициализации их для использования статических функций - PullRequest
4 голосов
/ 29 января 2011

Возможно, я спрашиваю об этом странным образом, но я не знаю, как еще спросить.

Я хочу иметь список классов, а не объектов. Таким образом, я могу вызывать статические функции без необходимости создавать объект.

Ответы [ 5 ]

4 голосов
/ 29 января 2011

Я бы действительно предпочел указатели функций на этом этапе:

struct A
{
  void SomeFunc(int);
};

struct B
{
  void AnotherFunc(int);
};


typedef void (*Function)(int);

std::vector<Function> vec;

vec.push_back(A::SomeFunc); vec.push_back(B::AnotherFunc);

for (Function f: vec)
{
  f(2);
}

Обратите внимание, что статическая функция более или менее эквивалентна традиционной C-функции (она просто получила доступ к некоторой дополнительной области).

2 голосов
/ 29 января 2011

То, что вы ищете, это форсированные списки типов .Однако я бы не рекомендовал погружаться в Boost MPL, если вы еще не очень имеете опыт работы с шаблонами и знаете, сколько их сложностей работает.

Теперь для простой домашней реализации:

struct Null {};

template <typename Type, typename Next>
struct List
{
  typedef Type Type;
  typedef Next Next;
};

//Now you can make lists like so:
typedef List<int, List<float List<short, Null> > > MyList;

Оттуда используйте рекурсивные реализации Templated для вызова требуемых статических методов.

Если вам нужна дополнительная информация об этих видах методов, вам следует прочитать Современный дизайн C ++

1 голос
/ 29 января 2011

В качестве решения вы можете создать список указателей методов

0 голосов
/ 29 января 2011

Я не думаю, что вы спрашиваете, возможно, по крайней мере, не так, как вы думаете.Вы не можете иметь переменную, массив, контейнерный класс или любое другое хранилище имен типов.Таким образом, вы не можете сделать что-то вроде

ListOfClasses[n]::someStaticMember(...);

в C ++.Это невозможно.

0 голосов
/ 29 января 2011

http://www.boost.org/doc/libs/1_45_0/libs/mpl/doc/refmanual/refmanual_toc.html

Например:

typedef vector<C1,C2,C3> types;
at_c<types,0>::type::method();
...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...