Githubにpushしてみる
してみた
https://github.com/Gitmoko/Sff
MUGENのSffv1をデコードしてBMP文字列をつくり、ユーザが、ハンドルを返すような画像処理関数をわたして、Group,Imageごとにmap配列をつくる
おしまい
Github登録してみる
<要約>↓にそってやればいいよ(順序通りやらないと死んだ。mail関係で)
Windows7にTortoiseGitをインストールしてGitHubにPushするまで
情弱ネットサーフで現在何が話題になっているのかを調べると、OSSとGitの組み合わせはよく見かけるものだ。チョチョイとググると、Gitってのはソフトウェアのバージョン管理システムだーとかpush,pull,rebase,"Github怖くないよ!"とか見つかる。なるほど多人数とかで開発するときは特に役に立つのね。
そんなホットなgit,どうやらCLIで操作するものらしい。俺のような思考停止Windows使用者にはそれだけで門前払いな気分になるの。
ところがGitのwindows版
msysgit
を、GUIで操作できるものがあって、
tortoisegit
というものがあるんだって。
見出し大きくする部分が頭悪い感じがするけど、IT強者と弱者では何が重要と感じるかは別物だと思うの。後者(というか俺)にとって、具体的に何をすればいい,何を入れればいいかがわかるってのが本当にうれしい。
とりあえずgitの概要、pull,cloneとかは情弱でも調べれば出るからいじって覚える。
今回つくったリポジトリはまだなんも入ってないから次で載せよう。
余談だけど
「Rubyにコミットしてます!」が断然興味をもってもらえるという話し【Tech向けネタ】 - ただのWikipedia好き大学生がシリコンバレー凸してfooo↑↑
この凄い行動力のある人(ほんとかっこいいと思う)のブログにあるように、OSSにコミットするのはアピールポイントになるんだって。
やっぱりsfinaeわかんない
前回
に関してもうちょい実験
//////////////////////////////////////
#include<iostream>
#include<type_traits>
extern void * enabler;
extern constexpr void* func();
template<typename T,
typename std::enable_if<true>::type * foo = func() >////////////////
void f(T)
{
std::cout << "T is arithmetic" << std::endl;
}
void f(...){ std::cout << "no match" << std::endl; }
int main()
{
int arithmetic = 0;
f(arithmetic); // T is arithmetic
return 0;
}
///////////////////////////////////////
Ideoneによる結果
no match//除外が起きた
定義のないconstexpr関数の返り値をテンプレート実引数に使おうとすると、sfinaeが起きて候補から外れた。つまりテンプレート引数の代入は失敗する
こう書き換えてみる
template<typename T,
typename std::enable_if<true>::type * foo() = func >////////////////
void f(T)
{
std::cout << "T is arithmetic ha" << std::endl;
}
関数ポインタを実引数に渡すようにする。
ideoneによる結果
T is arithmetic
定義のない関数のアドレスを渡すと、テンプレートの方が採用された。この代入は成功だと判断されるようだ。
sfinaeのenabler 2/2
じゃあenablerについてのど素人丸出し糞的外れな疑問をかくよー。
/////////////////////////////////コード始まり
extern void * enabler ;
template < typename T,
typename std::enable_if<std::is_arithmetic<T>::value >::type *& = enabler >
void f(T)
{
std::cout << "T is arithmetic" << std::endl;
}
////////////////////////////コード終わり
sfinaeについての例を探すとこんなのが出てくる(このコードは巷で有名な江添さんのサイト
本の虫: C++0xにおけるenable_ifの新しい使い方
から持ってきました)
「なんでenablerで初期化してリンカエラーにならないの?」
だって,たとえTがarithmeticで、eneble_if::typeがvoidだとして、void*& を enablerデフォルト実引数初期化するときに,enablerの定義がいるはずじゃん(それがそもそも違うのかもしれんけど)
というわけでこんな風に変更してみた
std::enable_if<std::is_arithmetic<T>::value >::type * = static_cast<void*>(&enabler )>
参照を外してenablerのアドレスを渡すようにしました
vc++では通った。ideoneでは駄目だった。こんなこと言われた
prog.cpp:13:87: error: could not convert template argument ‘(void*)(& enabler)’ to ‘std::enable_if<true, void>::type* {aka void*}’
わけわかんない
つぎに、enable_ifの部分は最初に書いたとおりに戻して、main関数にこれ入れてみた
f<int, enabler>(arithmetic);
vc++もideoneも通った。(しかしvc++のいんてりせんすは 1 IntelliSense: オーバーロードされた関数 "f" のインスタンスが引数リストと一致しません
引数の型: (int) とか言ってくる。コンパイル通って実行できるけど)
ちょっと外れて、main関数にこういうのを入れてみる
void* foo = &enabler
vc++通らない。未解決だそうだ。ideone通る。へー。
とまぁこんな風に、externがらみの奴がすっごいわかんない。
規格をよんでも、リンカについての詳しい話が見つかんないし、externalな変数が参照できる条件も見つからん。俺が見落としてるのか、実装依存なのか。
そうはいっても、テンプレートのデフォルト実引数にenablerを使うってのはboostライブラリに採用されているらしい。つまり合法であるという根拠があるはずなの。
あー見つかんないわかんない。
sfinaeのenabler 1/2
sfinaeのenablerについて疑問を持ちました
そのまえに、ど素人の俺がtemplateのデフォルト実引数について「へー面白いなー」と思ったことをかくよ。
テンプレートを書くときはこんな風にするよねー
template<class T,class U,int I>class Foo{};
でこの<>の中身の文法が、規格には「type-parameter」と「parameter-declaration」って書いてる。後者のほうは非型テンプレート引数の宣言だね
parameter-declarationってのは関数宣言の仮引数の宣言ルールでもある(まぁテンプレートの方はちょっと制約があるよ。完璧には知らんけど、型の制約があったり、コンパイル時に決まるものしか実引数に渡せないとか)
そんでー、よくsfinaeの例で使われる、
typename enable_if<(ry *& = enabler
てあるじゃん
これなんで識別子省略してもいいのかなーって思ったんだけど、上に書いた「parameter-declaration」の件を考えると、なんとなく通る理由がわかったよ
だって関数宣言って int func(int); とか省略するじゃん。あわよくばデフォルト引数を int func(int = 10);って書いたりできるからね。
それについてこんなクラスで確認してみた
///////////////////////コード始まり
template <class T,int = 8 >
struct Omission{
Omission(){ std::cout << "Omission t" << std::endl; }
};
template<class T,int L>
struct Omission<T*,L>{
Omission(){ std::cout << "Omission t* "<< L<< std::endl; }
};
////////////////////コード終わり
たとえばOmission<int*>()とかで部分特殊化の方を使うと、L にはデフォルト実引数で指定した8が入ってたことがわかった
関数のデフォルト実引数と同じような挙動をして面白いなーと思ったのでしたまる