【问题标题】:Deducing signature of (non-)templated types推断(非)模板类型的签名
【发布时间】: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&lt;typename R, typename... Args&gt; R apply(R(*f)(Args...), Args... args) { return f(std::forward&lt;Args&gt;(args)...); }我想我一定错过了问题的重点
  • 你会在哪里使用apply()

标签: c++ templates c++11


【解决方案1】:

下面是 apply 的实现,它使用函数指针或可调用类(如 lambda)并推导出模板参数:

#include <type_traits>
#include <utility>

template<class Fun, class... Args>
typename std::result_of<Fun(Args...)>::type
apply(Fun&& fun, Args&&... args)
{
    return fun(std::forward<Args>(args)...);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多