【发布时间】:2014-08-15 11:17:31
【问题描述】:
我对编写模板元编程比较陌生,这可能是我找不到解决这个问题的原因。问题是这样的:我正在开发一个数学库,其中包含许多函数,例如确定整数或 std::initializer_list 的素数、将整数更改为罗马数字等。当我尝试实现一个返回函数调用结果的通用函数时,瓶颈就开始了:
apply( foo, 1 ) === foo( 1 );
对于模板函数,这样写就没有任何意义了:
apply( foo<int, int, int...>, 1, 2, 3... ); //Case 1
apply<int, int, double...>( foo, 1, 2, 3...) // Case 2
//OR whichever flavours the (closure object or ) callable has.
所以我决定编写 apply,这样它就不必看起来像上面直接丑陋的代码(准确地说是 case 2)。我一开始登陆here,然后我认为这是不正确的,然后我又重写了here。
现在,我没有想法,我很清楚我可以在 apply 中使用 std::function 但我不想使用它,除非没有其他办法。请不要误会我的意思,我并不是说 std::function 在这里不适用,我只是说当且仅当我没有任何其他选择时我会这样做。
注意:数学库是我用来教我的大学同学 C++ 如何做事的副项目,因此我较少使用一些高级概念。
【问题讨论】:
-
您希望它适用于函数对象还是仅适用于函数?是否需要处理重载名称?
-
现在的目标是让它在没有重载名称的函数指针上工作。稍后我可能会想办法进一步扩展它,但如果有一个可以为“所有人”工作的解决方案,我将不胜感激。
-
这不是你想要的吗?
template<typename R, typename... Args> R apply(R(*f)(Args...), Args... args) { return f(std::forward<Args>(args)...); }我想我一定错过了问题的重点 -
你会在哪里使用
apply()?