凹みTips

C++、JavaScript、Unity、ガジェット等の Tips について雑多に書いています。

Objective-C++ 使って iOS で Boost.Asio してみた

はじめに

Objective-CC++ が混在できる Objective-C++ という魅力的な響きに誘われて、iPhone 上で Boost を動かすってのをやってみました。

やったこと


Boost.Asio が iPhone(シミュレータ)上で動いてます!

解説

Boost の導入に関しては以下のエントリが大変参考になりました。

感謝感謝です (-人-)。
まず、TextView を配置して ViewController と紐付けしておきます。
Objective-CC++ を混在させるためには、ソースファイルの拡張子を .m から .mm に変えるだけで OK なので、ViewController.m を ViewController.mm とします。
そして、以下の様なコードを書きます。

#import "ViewController.h"
#include <boost/asio.hpp>

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
    boost::asio::ip::tcp::iostream s( "www.boost.org", "http" );
    s << "GET / HTTP/1.0\r\n";
    s << "Host: www.boost.org\r\n";
    s << "\r\n";
    s << std::flush;
    std::string buf, html;
    while( std::getline(s, buf) ) {
        html += buf;
    }
    const auto csText = [[NSString alloc] initWithCString:html.c_str() encoding: NSUTF8StringEncoding];
    _textView.text = csText;
}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
}

@end

boost.org に http でアクセスして応答をもらってそれを TextView に流し込んでいます。Boost.Asio は libboost_system.a とのリンクが必要なので、Project の TARGETS > Summary > Linked Frameworks and Libraries から追加しておくのお忘れなく。

終わりに

たったこれだけ、これだけで C++ / Boost が使えてしまうとは…。ちなみに、Objective-C++ では auto で NSString* を推論できました。とても便利です。