gpt4 book ai didi

c++ - 推导(非)模板类型的签名

转载 作者:行者123 更新时间:2023-11-30 02:44:27 26 4
gpt4 key购买 nike

我对编写模板元编程比较陌生,这可能是我找不到解决这个问题的原因。问题是这样的:我正在开发一个数学库,它有很多函数,比如确定整数或 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++ 做事的副项目,因此我较少使用一些高级概念。

最佳答案

下面是 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)...);
}

关于c++ - 推导(非)模板类型的签名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25325518/

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