我有一个模板化函数,其中模板化参数是一个仿函数。我想生成一些特定于特定质量函数的内部变量,供该仿函数调用的其他模板函数使用。所以我已尝试使用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能够处理的东西?我试图实现的一般函数是基于模板化参数的类型生成一个对象,而不实际将新对象的类型传递给函数(即推断它)
由于
答案 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
的情况下实现。