- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我试图从 pluralsight 视频中理解这个例子(我已经做了一些修改):
#include <iostream>
#include <functional>
//this next line is partial specialization, but I don't understand why it's necessary
template<typename> struct Logger;
template <typename R, typename... Args>
struct Logger<R(Args...)>
{
std::function<R(Args...)> func_;
std::string name_;
Logger(const std::function<R(Args...)>& func, const std::string& name):
func_{func}, name_{name} {}
R operator() (Args... args)
{
std::cout << "Entering " << name_ << std::endl;
R result = func_(args...);
std::cout << "Exiting " << name_ << std::endl;
return result;
}
};
// this is how the example was originally written. It uses a function pointer as an argument which is ok except you can't give it a lambda.
template <typename R, typename... Args>
auto make_logger(R (*func)(Args...), const std::string& name) ->Logger<R(Args...)>
{
return Logger<R(Args...)>{std::function<R(Args...)>(func), name};
}
//this is my attempt to make it so it will accept a lambda but it doesn't work.
template <typename R, typename... Args>
auto make_logger2(std::function<R(Args...)> func, const std::string& name) ->Logger<R(Args...)>
{
return Logger<R(Args...)>{std::function<R(Args...)>(func), name};
}
double add(double a, double b, double c)
{
std::cout << a << " + " << b << " + " << c << " = " << a + b + c << std::endl;
return a + b + c;
}
int main()
{
auto logged_add = make_logger(add,"Add");
auto result = logged_add(2,3,5);
// auto lm = [](std::string str1, std::string str2){return str1 + str2;};
// auto logged_string = make_logger2(lm, "string add");
// auto result2 = logged_string("Hello ", "World!");
//I get the following compile error if the next two lines are uncommented:
// main.cpp:101: error: no matching function for call to 'make_logger2(main()::<lambda(std::__cxx11::string, std::__cxx11::string)>, const char [11])'
//auto logged_string = make_logger2([](std::string str1, std::string str2){return str1 + str2;},"string add");
//auto result2 = logged_string("Hello ", "World!");
std::cout << "result = " << result << std::endl;
//std::cout << "result2 = " << result2 << std::endl;
return 0;
}
我的两个主要问题是为什么是偏特化,是否可以修改代码使其也可以采用 lambda?
最佳答案
why is the partial specialization?
目的是提供一个函数类型,同时也得到它的返回类型和参数类型。
您只能通过部分特化来做到这一点,即以下特化:
template<typename> struct S;
template<typename R, typename... Args>
struct S<R(Args...)> { /* ... */ };
如您所见,主模板没有定义,因为在这种情况下根本不需要它。
无论如何,请注意它只接受一种类型。目的是按如下方式使用它:S<void(int, char)>
.
你怎么知道返回类型是 void
和 int
和 char
您的参数在主模板中吗?你不能,但你可以在专业范围内做。
is it possible to modify the code so it can take a lambda as well?
你甚至可以去掉 std::function
s 和函数指针,以便有一个仅基于 lambda 的解决方案。使用 lambda,您可以轻松捕获或调用其他函数。
这是一个最小的工作示例:
#include <iostream>
#include<type_traits>
#include <utility>
template <typename F>
struct Logger: F
{
std::string name_;
Logger(F &&func, const std::string& name):
F{std::move(func)}, name_{name} {}
template<typename... Args>
auto operator() (Args&&... args)
{
std::cout << "Entering " << name_ << std::endl;
auto result = F::operator()(std::forward<Args>(args)...);
std::cout << "Exiting " << name_ << std::endl;
return result;
}
};
template <typename F>
auto make_logger(F &&f, const std::string& name)
{
return Logger<std::decay_t<F>>{std::move(f), name};
}
double add(double a, double b, double c)
{
std::cout << a << " + " << b << " + " << c << " = " << a + b + c << std::endl;
return a + b + c;
}
int main()
{
auto logged_add = make_logger([](auto... args) { return add(args...); }, "Add");
auto result = logged_add(2,3,5);
}
关于c++ - C++ 中带有模板的装饰器模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41656705/
我之前让 dll 注入(inject)器变得简单,但我有 Windows 7,我用 C# 和 C++ 做了它,它工作得很好!但是现在当我在 Windows 8 中尝试相同的代码时,它似乎没有以正确的方
我正在尝试制作一个名为 core-splitter 的元素,该元素在 1.0 中已弃用,因为它在我们的项目中起着关键作用。 如果您不知道 core-splitter 的作用,我可以提供一个简短的描述。
我有几个不同的蜘蛛,想一次运行所有它们。基于 this和 this ,我可以在同一个进程中运行多个蜘蛛。但是,我不知道如何设计一个信号系统来在所有蜘蛛都完成后停止 react 器。 我试过了: cra
有没有办法在达到特定条件时停止扭曲 react 器。例如,如果一个变量被设置为某个值,那么 react 器应该停止吗? 最佳答案 理想情况下,您不会将变量设置为一个值并停止 react 器,而是调用
https://code.angularjs.org/1.0.0rc9/angular-1.0.0rc9.js 上面的链接定义了外部js文件,我不知道Angular-1.0.0rc9.js的注入(in
我正在尝试运行一个函数并将服务注入(inject)其中。我认为这可以使用 $injector 轻松完成.所以我尝试了以下(简化示例): angular.injector().invoke( [ "$q
在 google Guice 中,我可以使用函数 createInjector 创建基于多个模块的注入(inject)器。 因为我使用 GWT.create 在 GoogleGin 中实例化注入(in
我在 ASP.NET Core 1.1 解决方案中使用配置绑定(bind)。基本上,我在“ConfigureServices Startup”部分中有一些用于绑定(bind)的简单代码,如下所示: s
我在 Spring MVC 中设置 initBinder 时遇到一些问题。我有一个 ModelAttribute,它有一个有时会显示的字段。 public class Model { privat
我正在尝试通过jquery post发布knockoutjs View 模型 var $form = $('#barcodeTemplate form'); var data = ko.toJS(vm
如何为包含多态对象集合的复杂模型编写自定义模型绑定(bind)程序? 我有下一个模型结构: public class CustomAttributeValueViewModel { publi
您好,我正在尝试实现我在 this article 中找到的扩展方法对于简单的注入(inject)器,因为它不支持开箱即用的特定构造函数的注册。 根据这篇文章,我需要用一个假的委托(delegate)
你好,我想自动注册我的依赖项。 我现在拥有的是: public interface IRepository where T : class public interface IFolderReposi
我正在使用 Jasmine 测试一些 Angular.js 代码。为此,我需要一个 Angular 注入(inject)器: var injector = angular.injector(['ng'
我正在使用 Matlab 代码生成器。不可能包含代码风格指南。这就是为什么我正在寻找一个工具来“ reshape ”、重命名和重新格式化生成的代码,根据我的: 功能横幅约定 文件横幅约定 命名约定 等
这个问题在这里已经有了答案: Where and why do I have to put the "template" and "typename" keywords? (8 个答案) 关闭 8
我开发了一种工具,可以更改某些程序的外观。为此,我需要在某些进程中注入(inject)一个 dll。 现在我基本上使用这个 approach .问题通常是人们无法注入(inject) dll,因为他们
我想使用 swing、spring 和 hibernate 编写一个 java 应用程序。 我想使用数据绑定(bind)器用 bean 的值填充 gui,并且我还希望它反射(reflect) gui
我有这段代码,当两个蜘蛛完成后,程序仍在运行。 #!C:\Python27\python.exe from twisted.internet import reactor from scrapy.cr
要点是 Spring Batch (v2) 测试框架具有带有 @Autowired 注释的 JobLauncherTestUtils.setJob。我们的测试套件有多个 Job 类提供者。因为这个类不
我是一名优秀的程序员,十分优秀!