C ++: возможно ли использовать динамическое связывание с параметром шаблона? - PullRequest
3 голосов
/ 09 мая 2011

У меня есть функция шаблона, которая принимает объект-функцию ('functor') в качестве параметра шаблона:

 template <typename Func> int f (void) {
    Func func;
    return func ();
};

struct Functor {
   virtual int operator () (void) = 0;
};

struct Functor0 : Functor {
    int operator () (void) {
        return 0;
    }
};

struct Functor1 : Functor  {
    int operator ()  (void) {
        return 1;
    }
};

Я хочу избежать блока if-else, например:

int a;
if (someCondition) {
    a = f<Functor0> ();
}
else {
    a = f<Functor1> ();
}

Есть ли способ использовать что-то похожее на динамическое связывание, например что-то вроде:

a = f<Functor> (); // I know this line won't compile, it is just an example of what I need

и решить во время выполнения, какой (производный) тип передается в качестве параметра шаблона?

Ответы [ 2 ]

7 голосов
/ 09 мая 2011

Один из способов избежать проверки (если это действительно то, что вы хотите сделать), это использовать массив - ..

Functor* fp[] = { new Functor0(), new Functor1() };

сейчас - используйте someCondition в качестве индекса.

a = (*fp[someCondition])();

это просто полагается на полиморфизм времени выполнения, а не на механизм избыточных шаблонов, который вы используете ... (кстати, не забудьте очистить!)

Конечно, это неприятнои откровенно избыточный, издержки if будут незначительными, но ясность, которую он добавляет к коду, значительна ...

7 голосов
/ 09 мая 2011

Есть ли способ использовать что-то похожее на динамическое связывание

Нет.Это принципиально невозможно.В какой-то момент в вашем коде вы должны иметь различие в регистре.Конечно, это не должно быть написано вручную;Вы можете использовать макросы (или снова шаблоны) для генерации необходимого кода.Но это должно быть там.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...