我正在尝试创建一个具有std::function
成员和operator()
的类来调用该成员。这是我试过的:
template <class R, class... Args>
class Func{
public:
Func(std::function<R(Args...)> fnx) : fn(fnx) {} //Error
R operator()(Args... a) { return fn(a...); } //Error
private:
std::function<R(Args...)> fn; //Error
};
但是,我收到了一个神秘的错误
error: function returning a function
以Error
表示的行,我不明白 - 我没有看到任何函数被返回。它在哪里,我该如何解决?
完整的不工作示例: http://coliru.stacked-crooked.com/a/603a84184d9666a8
#include <iostream>
#include <functional>
int foo(int a, int b) { return a+b; }
template <class R, class... Args>
class Func{
public:
Func(std::function<R(Args...)> fnx) : fn(fnx) {}
R operator()(Args... a) { return fn(a...); }
private:
std::function<R(Args...)> fn;
};
Func<int(int,int)> foox;
int main() {
std::cout << foox(2,4);
return 0;
}
答案 0 :(得分:2)
在这一行......
Func<int(int,int)> foox
...您将int(int,int)
作为R
传递,而Args...
为空。 Clang中的错误更明显:
a.cpp:9:24: error: function cannot return function type 'int (int, int)'
Func(std::function<R(Args...)> fnx) : fn(fnx) {}
^
a.cpp:15:20: note: in instantiation of template class 'Func<int (int, int)>' requested here
Func<int(int,int)> foox;
^
a.cpp:10:5: error: function cannot return function type 'int (int, int)'
R operator()(Args... a) { return fn(a...); }
^
a.cpp:12:19: error: function cannot return function type 'int (int, int)'
std::function<R(Args...)> fn;
^
宣布foox
的正确方法是Func<int, int, int> foox;
。
答案 1 :(得分:0)
除了正确声明foox(如提到的cubuspl42)之外,您还缺少将所需的foo函数作为构造函数参数传递。
完整代码:
#include <iostream>
#include <functional>
int foo(int a, int b) { return a+b; }
template <class R, class... Args>
class Func{
private:
std::function<R(Args...)> fn;
public:
Func(std::function<R(Args...)> fnx) : fn(fnx) {}
R operator()(Args... a) { return fn(a...); }
};
int main() {
Func<int, int, int> foox(foo);
std::cout << foox(2,4);
return 0;
}
```
答案 2 :(得分:0)
我猜你想要这样的东西:
template<typename F>
class Func;
template<typename R, typename... Args>
class Func<R(Args...)> {
// ...
};
否则,您误导了Func
您定义它的方式
换句话说,这是修改后的示例代码:
#include<functional>
#include<iostream>
int foo(int a, int b) { return a+b; }
template<typename F>
class Func;
template<typename R, typename... Args>
class Func<R(Args...)> {
public:
Func(std::function<R(Args...)> fnx) : fn(fnx) {}
R operator()(Args... a) { return fn(a...); }
private:
std::function<R(Args...)> fn;
};
Func<int(int,int)> foox{foo};
int main() {
std::cout << foox(2,4);
return 0;
}