【问题标题】:"function returning a function" when inheriting constructors from std::function从 std::function 继承构造函数时“函数返回函数”
【发布时间】:2014-12-03 03:23:44
【问题描述】:

尝试从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 中。

【问题讨论】:

  • std 中的大多数类型都不是为了继承而设计的,包括 std::function
  • @Yakk 感谢您的提醒,尽管“你应该永远”的想法在"Thou shalt not inherit from std::vector" 辩论中有点争议。不过,目前这只是一个本地实验。
  • 您不妨私下进行,只需使用声明来执行您想要执行的操作。这样就没有机会从基类中获得支持。

标签: c++ inheritance c++11 constructor using


【解决方案1】:
MyFunction<void()> mine

根据您的班级,这将 R 推导出为 void()Args... 作为空参数包。如果您希望该语法起作用,则必须专门化您的类模板:

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

【讨论】:

  • 啊,我明白了。所以这就是为什么在非专业的std::function 上有那个/* undefined */...谢谢!
【解决方案2】:

要添加到 chris 的 answer,如果您希望当前定义起作用,请使用

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

如果您想要与std::function 相同的漂亮MyFunction&lt;R(Args...)&gt; 语法,那么您必须提供一个未实现的主类模板,以及一个派生自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...)>
{ ... }

Live demo

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-06-01
    • 2023-04-03
    • 1970-01-01
    • 2011-12-27
    • 2016-03-24
    相关资源
    最近更新 更多