Как реализовать этот генератор объектов конкретного типа без использования C ++ 0x auto - PullRequest
0 голосов
/ 06 апреля 2011

У меня есть шаблонная функция, где шаблонный параметр является функтором. Я хочу сгенерировать некоторые внутренние переменные, специфичные для конкретной функции качества, которые будут использоваться другими шаблонными функциями, вызываемыми из этого функтора. поэтому я экспериментировал с ключевым словом auto, и оно работает

template<typename QF>
float find_optimal_partition_louvain_with_gain(QF quality_function) {
    auto internal_variables = gen(quality_function);
    float result = do_some_work(internal_variables);
    ...
    return result;
}

struct internals_for_linearised_functor {
    double x;
};

internals_for_linearised_functor gen(mynamespace::linearised_function &f) {
    linearised_internals internals;
    internals.x = 5;
    return internals;
}

При использовании auto это нормально компилируется, что приятно. Я хотел бы попытаться остаться в рамках текущего стандарта, чтобы сделать мой код более переносимым. Есть ли способ, которым это может быть обработано с использованием текущего стандарта, или это то, что BOOST_AUTO сможет обработать? Основная функция, которую я пытаюсь достичь, - это генерировать объект на основе типа шаблонного параметра, фактически не передавая тип нового объекта в функцию (то есть выводя его)

Спасибо

Ответы [ 3 ]

2 голосов
/ 07 апреля 2011

Это должно работать из коробки:

template<typename QF>
float find_optimal_partition_louvain_with_gain(QF quality_function) {
    return do_some_work(gen(quality_function));
}

Если вам нужно, чтобы internal_variables был дольше, чем для одного вызова, вы можете использовать другую маленькую функцию для вывода типа:

template<typename QF, typename T>
float find_optimal_partition_louvain_with_gain_detail(QF quality_function, T internal) {
    float result = do_some_work(internal);
    /* use internal and quality_function again here!.*/
    return result;
}


template<typename QF>
float find_optimal_partition_louvain_with_gain(QF quality_function) {
    return find_optimal_partition_louvain_with_gain_detail(
      quality_function,
      gen(quality_function)
    );
}

Надеюсь, это поможет!

1 голос
/ 06 апреля 2011

Если вы не хотите использовать auto в этом случае, вам нужно будет использовать какую-то мета-функцию (возможно, признак функции), чтобы получить тип возврата gen.

Boost имеет функциональные черты, или вы можете реализовать класс черт специально для вашего типа QF. Если это стандартный тип объекта функции, он должен иметь result_type typedef, который вы можете получить, используя typedef typename QF::result_type result_type

0 голосов
/ 07 апреля 2011

Можете ли вы обернуть gen() как статический метод внутри структуры, а затем заменить internal_variables?См. Следующий измененный код.

struct Generate
{
  static internals_for_linearised_functor s_Internals; // define somewhere
  static void gen(mynamespace::linearised_function &f)
  {
    linearised_internals internals;
    internals.x = 5;
    s_Internals = internals;
  }
 };

Теперь в функции find_optimal_partition_louvain_with_gain вы можете сначала вызвать Generate::gen(), а затем использовать Generate::s_Internals вместо internal_variables.

Это, кажется, более простой способ избежать знания типа auto.Кроме того, вы можете сделать Generate как template<> при необходимости.Для безопасности потоков в приведенном выше коде мы можем реализовать без static также.

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