gpt4 book ai didi

c++ - 函数式模板语法

转载 作者:搜寻专家 更新时间:2023-10-31 01:29:37 24 4
gpt4 key购买 nike

我正在尝试编写一个相当简单的类,它接受一个函数和一些参数,并且可以在稍后使用参数执行该函数。

目前,这是我的代码:

template<typename R, typename... Args>
class Delayed
{
public:
using FunctionT = std::function<R(Args...)>;

Delayed(FunctionT func, Args... args) : func(func), args(std::forward<Args>(args)...)
{

}

private:
FunctionT func;
std::tuple<Args...> args;
};

int main()
{
std::function<double(double)> doubleMe = [](double x) { return x * 2.0; };

//Works
Delayed<double, double> delayed1(doubleMe, 2.0);

//Doesn't work
Delayed<double(double)> delayed2(doubleMe, 2.0);
}

问题是当我通过 double(double)作为参数,而不是 R正在doubleArgs正在double , 它通过 double(double)RArgs无关.

According to cppreference , std::function 的模板参数是template< class R, class... Args > .所以如果我给它A(B,C) , 它将通过 A对于参数 RB,C对于可变参数 Args .但是当我把它传给我的类(class)时,它传递了 A(B,C)对于 R并且不为可变参数 Args 传递任何内容.

应该如何使用此函数语法以及为什么它适用于 std::function但不是我的类(class)?

最佳答案

So if I give it A(B,C), it will pass A for the argument R and B,C for the variadic argument Args.

是的,但不是出于您认为的原因。如果仔细观察,您会发现 std::function 部分特化了任何函数类型:

template<typename R, typename... Args>
class function<R(Args...)>;
// ^^^^^^^^^^^^

您可以将其想象为非常原始的模式匹配。如果用 int(int, double) 实例化 function,那么 Rint 是有意义的,并且Argsint, double。如果(部分)特化比包罗万象的通用主模板更匹配,则选择它,这就是此处发生的情况。

记住:double(double) 是一种类型,它是一个函数。没有涉及它的任何特殊规则。所以,在你的情况下,你会这样做:

template<typename R, typename... Args>
class Delayed<R(Args...)> : public Delayed<R, Args...> {
// ^^^^^^^^^^^^
// partially specialize to decompose function types

// We need to inherit constructors (only).
using Delayed<R, Args...>::Delayed;
};

希望它能消除困惑。

关于c++ - 函数式模板语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49550541/

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