declval<T>() の返り値型が T&& である理由

メモ。

そもそも declval とは?

T1, T2 があり、それらの値を乗算した結果の型を得たい場合、 素直に考えると

decltype( T1() * T2() )

で得られそうだが、これは T1, T2 共にデフォルトコンストラクタが無いと T1(),T2()コンパイルエラーになってしまう。

そこで std::declval が使える。

decltype( std::declval<T1>() * std::declval<T2>() )

以下略

もし返り値型が T だった場合

struct Widget;

template<class T>
T my_declval();

decltype( my_declval<Widget>() * my_declval<Widget>() ) val;

T が不完全型の時にエラーになる。

もし返り値型が T& だった場合

struct Widget {
  Widget(Widget const&) = delete;
  Widget(Widget&&);  
};

template<class T>
T& my_declval();

int somefunc( Widget );

// エラー!
decltype( somefunc( my_declval<Widget>() ) ) val1; 

// OK
decltype( somefunc( std::move(my_declval<Widget>()) ) ) val1;

ムーブ構築しか出来ない場合に面倒くさくなる。

補足

尚、 declval は基本的に T&& を返すので

int somefunc( int& );
decltype( somefunc( std::declval<int>() ) ) val;

このコードがエラーになる(msvcだと通っちゃうんだけど)。 こういう場合は、

int somefunc( int& );
decltype( somefunc( std::declval<int&>() ) ) val;

と、渡す型に & を付けてやれば良い。 これが何故通るかというと、実は declval の返り値型は add_rvalue_reference<T>::type だからである。 add_rvalue_referenceT, T&&T&& で返し、 T&T& で返す。

では何故 add_rvalue_reference<T>::typeT&T& で返すかというと、 N3337 の 20.9.7.2 曰く

This rule reflects the semantics of reference collapsing (8.3.2).

とのことです(丸投げ)。

SDL2で出来る事メモごく一部

http://www.libsdl.org/

SDLのバージョン2が出ると同時になんかサイトもオシャレになってるので, チマチマWikiを眺めてて知ったことをメモ.

尚,この記事は http://wiki.libsdl.org/ に書いてあること以上の内容はありません.

続きを読む

LaTeXでgraphvizのコードを直接埋め込み記述する

graphvizzz - A LaTeX package for inline graphviz code - Google Project Hosting

これを用いると良い.

自分の環境では指定されたスタイルファイルの関係上pdflatexは使えず,platexを用いてたので少し改造して使った.↓がdiff

27,30c27,30
<   \immediate\write18{dot -Tpdf #2.dot > #2.pdf}
<   \IfFileExists{#2.pdf}
<   % the pdf exists: include it 
<   { \includegraphics[#1]{#2} } 
---
>   \immediate\write18{dot -Tps:cairo #2.dot > #2.eps}
>   \IfFileExists{#2.eps}
>   % the eps exists: include it
>   { \includegraphics[#1]{#2.eps} }

C++11のささやかなネタコード

C++11 では initializer_list が実装されたのでこんなことができます

data.txt

{
    {
        {1, 3},
        {5, 8}
    },
    {
        {3, 8},
        {1, 0},
        {8, 8}
    }
}

main.cpp

#include <iostream>
#include <utility>
#include <vector>

using namespace std;

vector<vector<pair<int, int>>> dataset 
#include "data.txt"
;

int main(){}

展開結果↓

http://melpon.org/wandbox/permlink/oh88hZW9pc6Rpe9z

int arr[] = {
#include "a.csv"
};

を思い出しますね

サーバに Alminium をインストールした

動機

  1. 色々がんばって構築したサーバを些細なミスから環境壊してしまった.
  2. もう一度設定するのめんどい
  3. Alminium(https://github.com/alminium/alminium)がその辺やってくれるらしい
  4. まっさら環境じゃないと入れにくいらしい
  5. ちょうどサーバまっさらにしたし入れてみよう

入れる

  1. さくらVPSでCentOSインストール直後の状態
  2. https://github.com/alminium/alminium に書いてる通りに入れた.Jenkinsも入れた.
  3. 30分くらいで入った

カスタマイズというか追加というか

  1. バックアップのために Mondo Rescue - GPL disaster recovery solution 入れた.
  2. 自動設定された iptables の設定を変えた
  3. SSL 証明書は StarSSL で持ってたので Apache の設定から証明書を変えた.
  4. RedmineOverview - Extended Fields - Andriy Lesyuk site 入れた.
  5. RedmineRedmine Plugin: add link to overall activities page 入れた.
  6. Redminemartin-denizet/redmine_login_audit · GitHub 入れた.
  7. Jenkinsに Doxygen プラグイン入れた.
  8. サーバのホスト名変えた.
  9. サーバのsshの設定変えた.
  10. 色々Redmine内でログイン必須にしたり設定した
  11. 色々Jenkins内で権限とか設定した
  12. メールの設定はされてなかったので config.yml 作って設定した
  13. VSプロジェクトビルドのためにWindowsのスレーブをJenkinsに追加した
  14. 他にも何かしたかもしれない

すごいとおもったとこ

  • JenkinsとかSVNリポジトリへのアクセスがRedmineのアカウントと共有できてる,すごい!
  • プラグインのおかげでRedmineからサーバ内にリポジトリ作成出来る,すごい!
  • Github風テーマでオシャレっぽい!
  • プラグインいくつか勝手に入れててくれて便利っぽい!バックログとかよくわからんけど
  • まぁとにかく時間かければ自分でも出来るけどちゃんと色々自動化されててパッと構築できて楽に出来て良い!

ちょっと気になってるとこ

  • Jenkinsでビルド中にRedmineからHudson画面に行く→活動→Hudsonとするとサーバエラーになる.
  • アカウント認証の共有本気でやるなら LDAP 自分で設定した方が良さそう?
  • Redmine SCM プラグインのおかげでサーバ内にリポジトリ作れるのは良いんだけど,副作用なのかリモートのリポジトリRedmineで設定出来ない……*1

つまり

すごいべんり

*1:元々Redmineでは出来ないんでしたね勘違いでした