如何在不将服务的头文件包含在类头中的情况下将模板服务传递给类?

时间:2019-04-08 03:44:00

标签: c++ dependency-injection variadic-templates forward-declaration

我有一个用于输入事件的模板化类,它包含在应用程序核心中。我想将对象从核心传递到另一个类,而不必在类的头文件中包含服务的头。

首先,这有可能吗?我知道我可以使用前向声明轻松地对非模板类执行此操作,但是在这种情况下,我认为这行不通。

此外,由于该类如何使用模板识别事件,因此无法将其抽象为基类。

我一直在考虑只是传递一个void指针,然后将其在.cpp中强制转换为应有的指针,但这会消除安全性。

在外面,模板看起来像这样:

NSString *credianls = [NSString stringWithFormat:@"username=%@&password=%@",self.usernameField.text, self.passwordField.text];
NSData* data = [credianls dataUsingEncoding:NSUTF8StringEncoding];

    NSURL *url = [NSURL URLWithString:@"https://api.robinhood.com/api-token-auth/"];
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:30.0];
    [request setHTTPMethod:@"POST"];
    [request setValue:@"application/json" forHTTPHeaderField:@"Accept"];
    [request setHTTPBody:data];
    [request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
    [request setValue:[NSString stringWithFormat:@"%d",[data length]] forHTTPHeaderField:@"Content-length"];

    __block NSMutableDictionary *resultsDictionary;
    [NSURLConnection sendAsynchronousRequest:request queue:[[NSOperationQueue alloc] init] completionHandler:^(NSURLResponse* response,NSData* data,NSError* error)
    {
        NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *) response;
        NSLog(@"response status code: %ld", (long)[httpResponse statusCode]);
        if ([data length]>0 && error == nil) {
            resultsDictionary = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableLeaves error:&error];
            NSLog(@"resultsDictionary is %@",resultsDictionary);

        } else if ([data length]==0 && error ==nil) {
            NSLog(@" download data is null");
        } else if( error!=nil) {
            NSLog(@" error is %@",error);
        }
    }];

将函数签名与匹配的枚举写入模板参数的地方。

我不确定在这里我想做的事是否可行,或者我是否一开始就疯狂设置它并试图使其按我想要的方式工作是不可行的

也许我只需要处理它,然后将包含的内容放进去。我想我先问一下,我将不胜感激。

1 个答案:

答案 0 :(得分:0)

@ n.m。 here写道:我是愚蠢的,因为他不想直接对其进行抽象。

using InputEventListener = event_listener<intput_events,
    event<intput_events::toggle_overlay, void(int)>,
    event<intput_events::toggle_console, void(int)>>;

实际上应该是:

class InputEventListener : public event_listener<intput_events,
    event<intput_events::toggle_overlay, void()>,
    event<intput_events::toggle_console, void(int)>> {};

很容易允许它被向前声明。