No Such Blog or Diary

«Prev || 1 | 2 | 3 |...| 1152 | 1153 | 1154 |...| 1330 | 1331 | 1332 || Next»

g++ のインライン展開

どうやら g++ は varargs な関数を展開できないらしい.

#include <iostream>
 
struct h {};
struct k : h {};
 
namespace g {
  inline bool f(...) { return false; }
  inline bool f(h* ) { return true;  }
}
namespace v {
  template <typename A>
  inline bool f(A)   { return false; }
  inline bool f(h* ) { return true;  }
}
 
int main(int argc, char *argv[])
{
  h *ph; k *pk; int *pi;
  std::cout << g::f(pi) << std::endl;
  std::cout << g::f(ph) << std::endl;
  std::cout << g::f(pk) << std::endl;
  std::cout << v::f(pi) << std::endl;
  std::cout << v::f(ph) << std::endl;
  std::cout << v::f(pk) << std::endl;
}

g::f(pi) は inline bool f(int* ) なので展開される.g::f(h()) は inline bool f(...) なので展開されない.他は全部展開.ついでに,(...) を使わずに単純にテンプレート変数を一つ用意すればいいかなと思ったけど(...)とテンプレートを用いた場合とでオーバーロードの解決優先度が違うのでだめらしい.

古いソースだとbool boost::detail::function::has_empty_targetはvarargsを使ってないのになぜ最近の実装では varargs を使うようになったのだろう?

boost::function で…

インライン展開失敗するなぁ.

#include <iostream>
#include <boost/function.hpp>
 
struct F_t {
  double operator()(const double & x) const { return 1.5 * x; }
} F;
 
inline double G(const double & x) { return 1.5 * x; }
 
int main(int argc, char *argv[])
{
  boost::function <double(const double &)> f = F;
  boost::function <double(const double &)> g = G;
  std::cout << f(2.0) << std::endl;
  std::cout << g(2.0) << std::endl;
}

ただの関数 g の場合はインライン展開されるけど関数オブジェクト f のときは bool boost::detail::function::has_empty_target(...) が展開できないといわれる.さてどうしたものか?

風神録ノーマルはほぼクリア

とりあえず霊夢の封印装備以外はすべてノーマルをクリア.魔理沙の魔法使い装備でオプション固定解除のタイムラグが大きくなってて戸惑った.オプション固定したまま素早く動けるようになったのはありがたいのだけど.次はExtraにでもチャレンジしてみやう.

そいういや風神録が出てたっけ

昨日から委託販売されてた気がするので風神録を買ってくる.ついでに GUNDEMONIUM RECOLLECTION も購入.とりあえずノーマルを頑張るか.

Pyramid-Quine@sed その3

エスケープの仕方を変えてみたら小さくなった.スコア 17 .

                ;
               ;;;
              s|^|\
             DDDh;s\
            /[BnD]//\
           g;y/bcde/B\
          BBnDE/CDDx;s\
         /$/BB/mg;s/^/;\
        Bn;;;BnsE^E/CD:;\
       s/^[^DBn]*BnB(DB+B\
      )/DB1B0/m;tCs/.$/E/p\
     ;x;s/[`-Bx66]/BUB0/gDD\
    DD;                     |
   h;s/[\n ]//g;y/BCDE/\\\n |/
  x;s/$/\\/mg;s/^/;\n;;;\ns|^|/
 :;s/^[^ \n]*\n\( \+\)/ \1\0/m;t
s/.$/|/p;x;s/[`-\x66]/\U\0/g    ;

ソース:pyramid-quine.17.sed

真中に空白があるのでまだ小さくなりそう.

Pyramid-Quine@sed その2

無駄を省いて小さくしてみた.スコア 19 .

                  ;
                 ;;;
                s|^|\
               QQh;s/\
              $/YY/mg;\
             s/^/;Yn;;;\
            YnsP^P/NQSs/\
           Y([^Yn]*YnY)Y(\
          SY+Y)/SY2Y1Y2/;N\
         Qs//SY2Y1Y2/;s//SY\
        2Y1Y2/;s/.$/P/p;NSx;\
       s/YnYPS//g;s/Yx59/YY/g\
      ;s/Yx53/S/gNs/Yx4E/Yn/g;\
     s/Yx50/P/g;s/Yx51/Q/gQ;   |
    h;s/$/\\/mg;s/^/;\n;;;\ns|^|/
   s/\([^\n]*\n\)\( \+\)/ \2\1\2/;
  s// \2\1\2/;s// \2\1\2/;s/.$/|/p;
 x;s/\n\| //g;s/\x59/\\/g;s/\x53/ /g
s/\x4E/\n/g;s/\x50/|/g;s/\x51/  /g  ;

ソース:pyramid-quine.19.sed 動かすには echo で改行だけ入れてやる必要あり.

 echo | sed -f pyramid-quine.19.sed | diff - pyramid-quine.19.sed

その他ソース:loose-expand.sedcloose-omp.sedreformatter.sed

«Prev || 1 | 2 | 3 |...| 1152 | 1153 | 1154 |...| 1330 | 1331 | 1332 || Next»
Search
Feeds

Page Top