如何在不使用C ++ 0x auto的情况下实现此类型特定的对象生成器

时间:2011-04-06 16:02:45

标签: c++ templates boost c++11

我有一个模板化函数,其中模板化参数是一个仿函数。我想生成一些特定于特定质量函数的内部变量,供该仿函数调用的其他模板函数使用。所以我已尝试使用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 个答案:

答案 0 :(得分:2)

这应该是开箱即用的:

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 :(得分:1)

如果您不想在这种情况下使用auto,则需要使用某种元函数(可能是函数特征)来获取gen的返回类型

Boost具有功能特性,或者您可以专门为您的QF类型实现特征类。如果它是一个标准的函数对象类型,它应该有一个result_type typedef,你可以使用typedef typename QF::result_type result_type

答案 2 :(得分:0)

您可以将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的情况下实现。