从 std::function 继承构造函数时"function returning a function"

"function returning a function" when inheriting constructors from std::function

本文关键字:function returning 继承 std 构造函数      更新时间:2023-10-16

试图从std::function派生一个类,并且对于初学者继承构造函数。 这是我猜到的:

#include <iostream>
#include <functional>
using namespace std;
template< class R, class... Args >
class MyFunction : public std::function<R(Args...)> {
public:
    using std::function<R(Args...)>::function;
};
int main() {
    std::function<void()> f_display_42 = []() { std::cout << 42; }; //works
    MyFunction<void()> mine = []() { std::cout << 42; }; //errors
}

返回的错误是:

prog.cpp: In instantiation of ‘class MyFunction<void()>’:
prog.cpp:14:24:   required from here
prog.cpp:6:7: error: function returning a function
 class MyFunction : public std::function<R(Args...)> {
       ^
prog.cpp:8:38: error: function returning a function
     using std::function<R(Args...)>::function;
                                      ^
prog.cpp:8:38: error: using-declaration for non-member at class scope
prog.cpp: In function ‘int main()’:
prog.cpp:14:55: error: conversion from ‘main()::__lambda1’
     to non-scalar type ‘MyFunction<void()>’ requested
     MyFunction<void()> mine = []() { std::cout << 42; };

在 GCC 4.8.2 中。

要添加到 chris' 的答案中,如果您希望当前定义有效,请使用

MyFunction<void> mine = []() { std::cout << 42; };

如果你想要与 std::function 相同的漂亮MyFunction<R(Args...)>语法,那么你必须提供一个未实现的主类模板,以及一个派生自std::function的专用化(这正是std::function所做的)。

template< class R, class... Args >
class MyFunction;
template< class R, class... Args >
class MyFunction<R(Args...)> : public std::function<R(Args...)>
{ ... }

现场演示

MyFunction<void()> mine

根据您的类,这会将R推断为void()Args...推断为空参数包。如果希望该语法正常工作,则必须专门化类模板:

template<class R, class... Args>
class MyFunction<R(Args...)> : blah