にほんごのれんしゅう

日本語として伝えるための訓練を兼ねたテクログ

各Visual StudioのC++規格対応状況

Visual StudioC++規格対応状況

次の仕事でVisual Studioが復活しそうなのでいろいろ予習してみました. GUIアプリでお手伝い程度ならの業務用アプリケーションなら、C#での開発が快速なのだろうが,学生時代のアルバイトを最後に3年ほど離れていた間に、C#の機能は拡張されDynamicという変数テンプレートのようなものができてた.これはC++にもほしい.

社会人生活3年で,C++の傾向の大局は知ったつもりなので,VC++にも手を伸ばしてもいいかなって思っています.

VC++コンパイラはcl.exeというものらしい.そういえば,昔利用した記憶が...

VC++C++のサポート状況

VS 2010 | C++11のコアの部分のlambdaはサポートしてたけど型を要求する.かなり、怪しいサポート状況らしい
VS 2013 | どっかに但し書きで一部のC++14の機能を持つとあったが,generic lambdaが使えない.
* C++11は頑張ってポートしたけどC++14には到達してない雰囲気*
どっこい,MSDNのブログを確認すると,C++11全部さえ到達してないっぽい
[MSDNブログ](http://blogs.msdn.com/b/vcblog/archive/2013/12/02/c-11-14-core-language-features-in-vs-2013-and-the-nov-2013-ctp.aspx

例を下記に書く Visual Studio 2013での検証.

#include "stdafx.h"
#include<boost/lexical_cast.hpp>
#include<string>
#include<iostream>
int _tmain(int argc, _TCHAR* argv[])
{
  auto str = boost::lexical_cast<std::string>(1);
  std::cout << str << std::endl;
  ([](std::string x){std::cout << "in lambda " << x; })(str);
      //↑ここがautoにできない...
  int a; std::cin >> a;
  return 0;
}

まじかよ...軽く絶望しました.generic lambdaじゃないとか関数オブジェクトに負けてる.

boost

また,上記の例ではboostを普通に用いている.boostを使えるという発見は大きい.
boostのコンパイルlinuxと同様の気持ちで臨むと(たぶんボーランドの奴と干渉して)よろしくないらしく,特殊なコンソールからのコンパイルが必要である.

C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Microsoft Visual Studio 2010\Visual Studio Tools\Visual Studio x64 Cross Tools コマンド プロンプト (2010)

このコンソールアプリから,booststrap.batb2.exeが実行できるようになる.
boostのコンパイルには時間がかかるのでコーヒーを飲みながらのんびり過ごすといつの間にか終わっています.

コンパイラへのパスの通し方だが,私は以下のようにしました.
[自分のプロジェクトを右クリック] → [VC++ディレクトリ] → [インクルードディレクトリとライブラリディレクトリを編集]
ex ) C:\boost_1_55_0とC:\boost_1_55_0\stage\libを追加した.
※これは私の環境であり,適宜必要なパスを設定してほしい.

VS独特の謎仕様

VSも最新の企画に頑張ってキャッチアップしている.しかし,本当に使いたいところでlambdaが使えないという悲しい事件に遭遇した.
そもそも,VC++C++でプロパティを実現するために関数オブジェクト(のようなもの)をイベントのトリガとなる関数ポインタに結び付けている.
そのclassのことをマネージクラスと言うらしい.マネージクラスで紐づけた関数で以下のことをすると怒られてコンパイルエラーになる.

エラー 2 error C3923: 'test::Form1::listBox1_SelectedIndexChanged::<lambda_ff036ba4f1bbbb91d8c7a2d0aa54c410>' : ローカル クラス、構造体、または共用体の定義は、マネージ クラスのメンバー関数では使用できません c:\users\gimpei.lenovo-pc\documents\visual studio 2010\projects\test\test\Form1.h    162 1 testEditor  

構造体とは関数オブジェクト→つまりlambda <=こいつら禁止ってことなんだと思う.MSがどうやってlambdaを実装したかちょっとわかるエラーだった.

VC++は結局使うべきか

 GUIアプリを作る分にはC#でいいんじゃないかという気がしてならない.ただ,C#はレイヤが低いところにアクセスするのが苦手なので,C#用のハードウェアレベルの拡張機能VC++を用いてやってあげればいいと思う.

最後に

QtもGTKもMSも全部独自のstringを持っていてたいへんやりずらい.
std::stringは再実装したくなるようなやつなのは理解しているが,そろそろ,「このstringが汎用的かつ効率的だ!」ってのを標準化してほしい.
なんならboostに入れてもいいと思う.