尝试从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。
答案 0 :(得分:2)
MyFunction<void()> mine
根据您的课程,这会将R
推断为void()
和Args...
作为空参数包。如果您希望该语法有效,则必须专门化您的类模板:
template<class R, class... Args>
class MyFunction<R(Args...)> : blah
答案 1 :(得分:1)
添加到chris&#39; answer,如果您希望当前的定义有效,请使用
MyFunction<void> mine = []() { std::cout << 42; };
如果您需要与MyFunction<R(Args...)>
相同的漂亮std::function
语法,那么您必须提供未实现的主要类模板,以及源自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...)>
{ ... }