Jav*_*imi 5 c++ templates std-function
我想制作一个简单的记录器,它自动运行函数并返回其值。
该类定义为:
template <typename R, typename... Args>
class Logger3
{
Logger3(function<R(Args...)> func,
const string& name):
func{func},
name{name}
{}
R operator() (Args ...args)
{
cout << "Entering " << name << endl;
R result = func(args...);
cout << "Exiting " << name << endl;
return result;
}
function<R(Args...)> func;
string name;
};
Run Code Online (Sandbox Code Playgroud)
我想将以下简单add
函数传递给记录器:
int add(int a, int b)
{
cout<<"Add two value"<<endl;
return a+b;
}
Run Code Online (Sandbox Code Playgroud)
通过这样调用它:
auto caller = Logger3<int(int,int)>(add,"test");
Run Code Online (Sandbox Code Playgroud)
但是,它会产生以下错误:
error: function returning a function
133 | Logger3(function<R(Args...)> func,
| ^~~~~~~
decorator.h:138:7: error: function returning a function
138 | R operator() (Args ...args)
| ^~~~~~~~
decorator.h:145:26: error: function returning a function
145 | function<R(Args...)> func;
Run Code Online (Sandbox Code Playgroud)
您的代码中有3个问题:
Logger3
模板需要R
是函数的返回值Args
(及其参数)。R
不是您尝试实例化所暗示的函数类型Logger3
)。Logger3
在您的情况下实例化一个获取 2int
并返回 an 的函数int
应该是:auto caller = Logger3<int, int, int>(add, "test");
Run Code Online (Sandbox Code Playgroud)
您的Logger3
构造函数应该是公共的,以便从类外部调用它。
出于效率原因,您应该使用std::forward
将参数转发operator()
到您的函数。这将避免参数的复制(在它们的类型比int
s 更复杂的情况下更重要)。
请注意,为了按std::forward
预期工作,operator()
它本身必须是使用转发引用的可变参数模板(见下文)。
完整修复版本:
auto caller = Logger3<int, int, int>(add, "test");
Run Code Online (Sandbox Code Playgroud)
输出:
Entering test
Add two value
Exiting test
result: 7
Run Code Online (Sandbox Code Playgroud)
演示:Godbolt。
旁注:最好避免using namespace std
- 请参阅此处:为什么是“using namespace std;” 被认为是不好的做法?。
您需要使用模板类部分特化来获取R
.
template <typename F>
class Logger3;
template <typename R, typename... Args>
class Logger3<R(Args...)>
{
// implementation details
};
Run Code Online (Sandbox Code Playgroud)
当您显式指定 时,这会匹配部分特化的int
模板参数。R
Logger3<int(int,int)>
归档时间: |
|
查看次数: |
294 次 |
最近记录: |