gpt4 book ai didi

c++ - 是否有一种通用方法可以将函数模板改编为多态函数对象?

转载 作者:IT老高 更新时间:2023-10-28 23:21:34 26 4
gpt4 key购买 nike

我有一些函数模板,例如

template <typename T>
void foo(T);

template <typename T>
void bar(T);

// others

我需要将每一个传递给一个算法,该算法将以各种类型调用它,例如

template <typename F>
void some_algorithm(F f)
{
// call f with argument of type int
// call f with argument of type SomeClass
// etc.
}

我无法在未实例化的情况下传入我的函数模板,但我也无法使用任何特定类型对其进行实例化,因为 some_algorithm 需要使用几种不同类型的参数调用它。

我可以将我的函数模板调整为多态函数对象,例如

struct foo_polymorphic
{
template <typename T>
void operator()(T t)
{
foo(t);
}
};

然后将其作为 some_algorithm(foo_polymorphic()) 传递。但这需要为我的每个函数模板编写一个单独的适配器。

是否有一种通用方法可以将函数模板调整为多态函数对象,即我可以为需要调整的每个函数模板重复使用的某种机制,而不必为每个单独声明一些东西?

最佳答案

问题的简写版本被赋予重载名称f,如何简洁地写出一个对象ff使得ff(a0, a1, a2, ...) 最终调用 f(a0, a1, a2, ...)

多态仿函数,你如何指出自己,是通常的解决方案。但它必须定义得不合时宜(因为它有一个模板成员),所以我认为这对于我的回答来说不够简洁。

目前 lambda 表达式产生一个单态仿函数,所以它们很接近但并不完全在那里。

// set of functions overloaded on int and double
void f(int);
void f(double);

auto ff = [](int i) { return f(i); };

正如 GMan 在评论中指出的那样,多态 lambda 将(应该?)成为简洁地内联编写多态仿函数的解决方案。

同时,可以编写一个 make_overload 帮助器,将多个仿函数合二为一,这样

auto ff = make_overload(
[](int arg0) { return f(arg0); }
, [](double arg0) { return f(arg0); } );

将“捕获”整个重载集。也许 Boost.Preprocessor 宏在这里可以提供帮助,以便 auto ff = POLYMORPHIC_LAMBDA( 1, (int)(double), { return f(arg0); } ); 内联使用。但是,我怀疑存在数量限制(因此是第一个宏参数),这与通常的离线手写多态仿函数解决方案不同;所以这对例如没有帮助可变参数函数模板。

关于c++ - 是否有一种通用方法可以将函数模板改编为多态函数对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7033645/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com