26a9491a-s

1: 以下、\(^o^)/でVIPがお送りします 2015/01/26(月) 22:15:00.98 ID:OQjFg89U0.net
俺の事純粋に評価してくださいお願いします不安なんです。

一応C++とかで、別言語でもある程度知ってる。
オブジェクト指向も理解出来てると思う。
全レスする



2: 以下、\(^o^)/でVIPがお送りします 2015/01/26(月) 22:24:25.76 ID:7aXA4r800.net
一度に何案件までまわせる?



5: 以下、\(^o^)/でVIPがお送りします 2015/01/26(月) 22:33:55.01 ID:OQjFg89U0.net
>>2
1つで限界



3: 以下、\(^o^)/でVIPがお送りします 2015/01/26(月) 22:25:27.47 ID:pmWC3bCz0.net
「一応C++」ってことは、templateとかconstexprとかは最低限しか使えない系の奴だな?



5: 以下、\(^o^)/でVIPがお送りします 2015/01/26(月) 22:33:55.01 ID:OQjFg89U0.net
>>3
そうだねー、両方知ってるけど何処でどう使うのかが正しいのかが分からない。
特に後者はstatic constで良くない?とか思う。



6: 以下、\(^o^)/でVIPがお送りします 2015/01/26(月) 22:36:25.90 ID:pmWC3bCz0.net
>>5
constexprとstatic constは全く意味が違うぞ
constexprはコンパイル時に定数でなければならない場所(配列サイズとか)にも使える



7: 以下、\(^o^)/でVIPがお送りします 2015/01/26(月) 22:37:41.83 ID:OQjFg89U0.net
>>5
C++の流儀とは外れてしまうけど、#defineじゃダメなの?



8: 以下、\(^o^)/でVIPがお送りします 2015/01/26(月) 22:42:18.39 ID:pmWC3bCz0.net
>>7
そもそも#defineを消し去るための機能だしな
それに#defineはテンプレート化できないし、名前空間内にも入れられないじゃん?



11: 以下、\(^o^)/でVIPがお送りします 2015/01/26(月) 22:49:58.52 ID:OQjFg89U0.net
>>8
そういう利点があったのか。
あまりテンプレート自体殆ど使わない(当然メタプロも知識だけで書けない)からそこらへん疎い。



4: 以下、\(^o^)/でVIPがお送りします 2015/01/26(月) 22:28:03.23 ID:L52vBYaBr.net
じゃあとりあえず型がhoge()メンバ関数を持っているかどうかを判別するhas_hoge<T>テンプレートクラスを作ってみて
hoge関数持ってるならstd::true_typeを継承して、持ってないならstd::false_typeを継承するようにしてな



5: 以下、\(^o^)/でVIPがお送りします 2015/01/26(月) 22:33:55.01 ID:OQjFg89U0.net
>>4
>型がhoge()メンバ関数を持っているかどうか
ちょっと良く分からない、リフレクションをC++で書けって事? ごめんそれは直ぐに実装出来なさそう。



9: 以下、\(^o^)/でVIPがお送りします 2015/01/26(月) 22:44:18.74 ID:L52vBYaBr.net
>>5
リフレクションではない
「hoge()関数を持っている型」と「hoge()関数を持たない型」で別のテンプレートを実体化させるテクニック
has_hoge
があると、

template{}>::type* = nullptr>
void f1(const T& t) {
std::cout << "This type has hoge() member function" << std::endl;
}

template{}>::type* = nullptr>
void f1(const T& t) {
std::cout << "This type doesn't have hoge() member function" << std::endl;
}

みたいなことができる



11: 以下、\(^o^)/でVIPがお送りします 2015/01/26(月) 22:49:58.52 ID:OQjFg89U0.net
>>9
こういうコードって、やっぱり読めて普通なの? それともイディオムにあるやつ?
正直読もうと思わない俺がプログラマー失格なのか。



12: 以下、\(^o^)/でVIPがお送りします 2015/01/26(月) 22:53:03.01 ID:pmWC3bCz0.net
ぶっちゃけ>>4は定型なのでggってできればよし
SFINAEというC++最大の黒魔術を使うからな



18: 以下、\(^o^)/でVIPがお送りします 2015/01/26(月) 22:59:57.83 ID:OQjFg89U0.net
>>12
ググったけどメタ系なのね。
メタ系は使いこなせる気がしないってか、仕様でそこまで複雑な実装求められる事無い気がする。
求められたらおとなしく「無理です」かスクリプト言語で実装すると思う。



10: 以下、\(^o^)/でVIPがお送りします 2015/01/26(月) 22:49:12.14 ID:pmWC3bCz0.net
でもconstexprが一番効果を発揮するのは再帰だな

// 階乗
constexpr int fact(int n) { return (n==0) ? 1 : fact(n-1); }

int arr[fact(5)]; // ←#defineでやるとわけのわからんおまじないを大量に書く羽目になる



13: 以下、\(^o^)/でVIPがお送りします 2015/01/26(月) 22:53:48.94 ID:OQjFg89U0.net
>>10
三項演算子で再帰カッコいいけど読みたく無いとか思う。
というか再帰自体そもそも読みたく無いとか思っちゃう。

ダメプログラマーですねはい。



15: 以下、\(^o^)/でVIPがお送りします 2015/01/26(月) 22:56:13.04 ID:pmWC3bCz0.net
>>13
俺だって使いたくないんだが、C++11にはconstexpr関数に制限があってだな……
C++14だとちゃんとifとか使えるぜ!
forループも使えるから再帰しなくていいぜ!
やったね!



18: 以下、\(^o^)/でVIPがお送りします 2015/01/26(月) 22:59:57.83 ID:OQjFg89U0.net
>>15
俺はそっちのが奇麗だと思う。



14: 以下、\(^o^)/でVIPがお送りします 2015/01/26(月) 22:55:34.44 ID:CFbzesw+0.net
テンプレート駆使するのって
俺カッケー系じゃなくて、必要に迫られて書いた結果複雑にならざるを得ないってだけなの?



18: 以下、\(^o^)/でVIPがお送りします 2015/01/26(月) 22:59:57.83 ID:OQjFg89U0.net
>>14
皆が使うライブラリの汎用化ゆえって事?



20: 以下、\(^o^)/でVIPがお送りします 2015/01/26(月) 23:00:57.99 ID:pmWC3bCz0.net
>>14
基本的にそう
でもconstexprのおかげで多少はマシになったので喜べ

ただ、それはそうと「それは本当にテンプレートで実現すべきなのか」って問題があるので、
ライブラリーを作る人以外でテンプレートを使ってる奴はちょっと疑った方がいい



24: 以下、\(^o^)/でVIPがお送りします 2015/01/26(月) 23:05:36.01 ID:OQjFg89U0.net
>>20
>それは本当にテンプレートで実現すべきなのか
これ。 もっと分かりやすい実装方法があるはず(多分



16: 以下、\(^o^)/でVIPがお送りします 2015/01/26(月) 22:56:14.96 ID:ZcEWsaXC0.net
文系なんだけど誰かこれまでのレスをドラゴンボールに例えてくれ



18: 以下、\(^o^)/でVIPがお送りします 2015/01/26(月) 22:59:57.83 ID:OQjFg89U0.net
>>16
俺が戦闘力5



17: 以下、\(^o^)/でVIPがお送りします 2015/01/26(月) 22:56:42.69 ID:L52vBYaBr.net
C++14だと再帰もしなくていいんですよ

constexpr int pow(int x, int y) {
&nbsp; &nbsp; static_assert(y>=0);
&nbsp; &nbsp; if(!y) return 1;
&nbsp; &nbsp; while(y-->1) x*=x;
&nbsp; &nbsp; return x;
}



21: 以下、\(^o^)/でVIPがお送りします 2015/01/26(月) 23:01:34.60 ID:OQjFg89U0.net
>>17
もの凄く奇麗だと思ったlgtm



26: 以下、\(^o^)/でVIPがお送りします 2015/01/26(月) 23:05:58.03 ID:pmWC3bCz0.net
>>17
ここでstatic_assertが使えるのがconstexprのいいところだよな



28: 以下、\(^o^)/でVIPがお送りします 2015/01/26(月) 23:07:27.69 ID:L52vBYaBr.net
>>26
俺は0==yの方が許せんけどそれを言い出すと戦争になる
まあ確かに--y>0の方が良かった。それは認めよう



30: 以下、\(^o^)/でVIPがお送りします 2015/01/26(月) 23:09:00.02 ID:pmWC3bCz0.net
>>28
うむ、ではそこはお互い見なかった事にしよう



32: 以下、\(^o^)/でVIPがお送りします 2015/01/26(月) 23:11:20.48 ID:OQjFg89U0.net
>>30
ちなみに俺もマジックナンバーが先頭に来て比較してるのは気持ち悪いと思った



34: 以下、\(^o^)/でVIPがお送りします 2015/01/26(月) 23:15:45.31 ID:pmWC3bCz0.net
>>32
==比較は定数が前ってのは基本
すなわちy==0と0==yであれば0==yが正義

……とは言われてるけど、最近のコンパイラならy=0にしたらちゃんと警告出すし、
そもそもコンパイルオプションで警告をエラーにするから、別にあんま気にしなくていいよな



19: 以下、\(^o^)/でVIPがお送りします 2015/01/26(月) 23:00:35.76 ID:DRE7QkaV0.net
c++ほとんど初めてみたけど触りたくないと思いました、はい



24: 以下、\(^o^)/でVIPがお送りします 2015/01/26(月) 23:05:36.01 ID:OQjFg89U0.net
>>19
俺もJKのケツとかのが触りたい



22: 以下、\(^o^)/でVIPがお送りします 2015/01/26(月) 23:02:15.51 ID:I7MsIrZW0.net
再帰って綺麗で好きだけどな



24: 以下、\(^o^)/でVIPがお送りします 2015/01/26(月) 23:05:36.01 ID:OQjFg89U0.net
>>22
実装者本人としては、書いてる時は凄く奇麗でロジカルに見えるんだけど
第三者から見たら白目



23: 以下、\(^o^)/でVIPがお送りします 2015/01/26(月) 23:04:57.71 ID:6PjhRHNy0.net
PMとしてプロジェクトまわせる?



27: 以下、\(^o^)/でVIPがお送りします 2015/01/26(月) 23:06:31.06 ID:OQjFg89U0.net
>>23
無理だよ。
微妙にコミュ障だからそういう立場立てる気がしない。



25: 以下、\(^o^)/でVIPがお送りします 2015/01/26(月) 23:05:41.17 ID:L52vBYaBr.net
constexprで再帰を書く時は、大抵一回constexprじゃない形でループで実装したものを再帰の形に落としこむ作業になるから二度手間



29: 以下、\(^o^)/でVIPがお送りします 2015/01/26(月) 23:07:56.21 ID:6PjhRHNy0.net
そのへんによくいるプログラマ 単価50前後



31: 以下、\(^o^)/でVIPがお送りします 2015/01/26(月) 23:09:59.92 ID:OQjFg89U0.net
>>29
そんなもんですよね。。



33: 以下、\(^o^)/でVIPがお送りします 2015/01/26(月) 23:13:15.91 ID:CFbzesw+0.net
0乗は1って自明な数字だと思うんだけどマジックナンバーなのか?



35: 以下、\(^o^)/でVIPがお送りします 2015/01/26(月) 23:17:34.74 ID:OQjFg89U0.net
>>33
0==yのレスだけみて勝手にマジックナンバー扱いしてた。
俺アスペなのかも



36: 以下、\(^o^)/でVIPがお送りします 2015/01/26(月) 23:17:36.72 ID:I7MsIrZW0.net
代入演算との誤読を避けるためか
でも定数が左だとなんか落ち着かないな



37: 以下、\(^o^)/でVIPがお送りします 2015/01/26(月) 23:22:18.81 ID:OQjFg89U0.net
>>36
分かる、なんかコード見ててこういうコードに出くわしたら一瞬スクロールが止まる気がする。
ん!? あー。みたいな



38: 以下、\(^o^)/でVIPがお送りします 2015/01/26(月) 23:23:24.87 ID:L52vBYaBr.net
>>36みたいな感覚の人も多いし、>>34で言われてる通りコンパイラで警告とかエラー出してくれるし、そもそも変数==変数みたいな式だとどうしようもないから、可読性が高いほうがいいと思って変数前にしてるけど、定数前派の意見も分からなくはない
会社でそこで論争になったことはないけどね。それ以前に、x>y+xみたいな恐ろしげな条件式がコードに紛れ込んでたりするし



39: 以下、\(^o^)/でVIPがお送りします 2015/01/26(月) 23:26:36.25 ID:pmWC3bCz0.net
>>38
結局その辺は「コーディングルールで決めろ」だよな

つかそのx>y+xって何したいんだそれ
実はxかyのどちらかがunsignedで、オーバーフローを利用した高度な複合条件設定でもしてんのか



41: 以下、\(^o^)/でVIPがお送りします 2015/01/26(月) 23:30:58.39 ID:L52vBYaBr.net
>>39
いや、元々右側のxは定数だったんだが、修正が入って定数がxに置き換わったところ、左辺にもxがあるからもっと分かりやすい条件にできるはずなのにスルーされてしまったという歴史があるらしい
つまりうちのソースコードはクソの山



43: 以下、\(^o^)/でVIPがお送りします 2015/01/26(月) 23:38:29.53 ID:pmWC3bCz0.net
>>41
デカいプロジェクトだとそういうのに気付いてもおいそれと直せないから困るよな
直すとフルテスト必要になったりするし

まあでも
「今までフレームワーク側が間違ってたので、引数の意味が変わりまーす! あ、該当箇所はこっちで全部修正したんで」
とか言って一気にコミットし終えたらさっさと帰った奴よりはマシだと思う



40: 以下、\(^o^)/でVIPがお送りします 2015/01/26(月) 23:27:41.01 ID:CFbzesw+0.net
定数前って定石じゃなかったのか?知らない人がいるなんて
こりゃコーディング形式で派閥もできるわな



42: 以下、\(^o^)/でVIPがお送りします 2015/01/26(月) 23:33:25.63 ID:OQjFg89U0.net
ちょっと皆の意見聞きたいんですけど
C++でラムダ、コールバック、std::functionの乱用してるコードってどう思う?



44: 以下、\(^o^)/でVIPがお送りします 2015/01/26(月) 23:38:45.19 ID:L52vBYaBr.net
ラムダは使いどころによるな
一行で済むようなコールバックのために一々クラス定義するよりはすっきりする場合もあるし
ただ、std::functionはstd::shared_ptrと組み合わさると気づかない内に循環参照産んでたりするから注意しないといけない



45: 以下、\(^o^)/でVIPがお送りします 2015/01/26(月) 23:42:31.58 ID:DjWX2L3w0.net
前職場ではVisual C++6.0が現役(!)だったせいで
ラムダとかconstexprとかの話題に全くついていけない俺様が参上

VS2012で遊んでるけど謎のフリーズバグがググって直し方のとおりにやっても治らず



46: 以下、\(^o^)/でVIPがお送りします 2015/01/26(月) 23:43:51.21 ID:pmWC3bCz0.net
C#みたいに

hoge.event += [](CObject* pSender, CEventArg* pEventArg) {
 // なんか
};

って感じのは作った事があるな
あとはstd::sort()とかの引数に使うくらいしかラムダは使わん



50: 以下、\(^o^)/でVIPがお送りします 2015/01/26(月) 23:51:19.17 ID:OQjFg89U0.net
>>46
C#良く知らんけど
hoge.event += [](){};
ってものすげー地獄の始まりな気がしてワロタ

俺は絶対追いたく無い、vector<funciton>にpushbackしてる的な感じを想像



52: 以下、\(^o^)/でVIPがお送りします 2015/01/26(月) 23:53:45.88 ID:pmWC3bCz0.net
>>50
うむ、当然そうなるっきゃないな
C#だと-=で外せるんだがC++だと外せそうにないんでやめた



54: 以下、\(^o^)/でVIPがお送りします 2015/01/26(月) 23:55:38.73 ID:OQjFg89U0.net
>> 52
>C#だと-=で外せる

ふぁーwwwwwwwwwwwwwwwwwwwwwww



47: 以下、\(^o^)/でVIPがお送りします 2015/01/26(月) 23:44:37.69 ID:L52vBYaBr.net
C++11とC++14の快感に慣れるとVisual Studioとかいう未だに規格に準拠できないクソ環境で遊べなくなってしまう
だから早くClangに乗り換えるのじゃ



48: 以下、\(^o^)/でVIPがお送りします 2015/01/26(月) 23:49:10.00 ID:7WRsQQ8v0.net
shared_ptrの循環参照こわい
GCあればこんなのにはまらずにすむのに



49: 以下、\(^o^)/でVIPがお送りします 2015/01/26(月) 23:50:18.80 ID:yhAEg7inp.net
俺が知ってるラムダ式は (map (lambda (x) (* x x)) '(1 2 3)) みたいなのだけだわ



53: 以下、\(^o^)/でVIPがお送りします 2015/01/26(月) 23:54:30.99 ID:xX5VrhYv0.net
>>49
さいきんはJavaとかC#とかにも導入されてる



51: 以下、\(^o^)/でVIPがお送りします 2015/01/26(月) 23:52:46.70 ID:fYGtxpO90.net
色々勉強したけど何も作れないって感じなんだろうな



55: 以下、\(^o^)/でVIPがお送りします 2015/01/26(月) 23:59:13.30 ID:u90xvXdTd.net
ラムダ式っていいの?



57: 以下、\(^o^)/でVIPがお送りします 2015/01/27(火) 00:04:38.02 ID:VxFxTawc0.net
>>55
個人的には諸刃の剣だと思ってる。
関数の実装を途中で「使う側」に丸投げする機能だからなぁ。(便利だけど。



61: 以下、\(^o^)/でVIPがお送りします 2015/01/27(火) 00:14:34.97 ID:tXsZvVYr0.net
>>57
まあ最近の言語では普通の機能だし、よいのではないだろうか



62: 以下、\(^o^)/でVIPがお送りします 2015/01/27(火) 00:15:34.88 ID:ibYpIXka0.net
>>61
Android標準搭載java1.6「ちょ待てよ」



56: 以下、\(^o^)/でVIPがお送りします 2015/01/27(火) 00:01:41.03 ID:ibYpIXka0.net
javaのラムダ式スレッドの勉強するときとか凄い楽
()->{out.println("ようかんのしわざだ!!");}



58: 以下、\(^o^)/でVIPがお送りします 2015/01/27(火) 00:04:52.10 ID:yQlDA57Or.net
C++においては、実体は関数オブジェクトに過ぎないからいいかどうかと言われるとそれ単体では別に大した技術でもない
ただ見た目がおでんみたいなのはいただけない
--[](){}-



59: 以下、\(^o^)/でVIPがお送りします 2015/01/27(火) 00:06:04.19 ID:gTAxDdhRd.net
顔文字みたい…
ラムダ式とか暗号にみえる…
かけだしプログラマー覚えることたくさんでつらたん



60: 以下、\(^o^)/でVIPがお送りします 2015/01/27(火) 00:14:35.54 ID:ibYpIXka0.net
[a-z]ya?pみたいなXMLやルビィーにおける文字パターンの方が顔文字みたいだよ



63: 以下、\(^o^)/でVIPがお送りします 2015/01/27(火) 00:19:11.54 ID:xxUmMDiP0.net
顔文字っていうとこれ思い出すな
int main() {
return 'o' ^0^ -~- -0- ~-~ +0+ 0-0 *0* 0*0;
}



64: 以下、\(^o^)/でVIPがお送りします 2015/01/27(火) 00:21:48.32 ID:yQlDA57Or.net
そろそろ寝る。ググったらすぐ出てくるようなのだけど>>4の答え書いとく
http://melpon.org/wandbox/permlink/zx9Sbe6knn8wRnVv

#include
#include
#include

template
struct has_hoge_checker
{
    template
    static auto check(U&& u) -> decltype(u.hoge(), std::true_type{});
    static std::false_type check(...);
   
    using type = decltype(check(std::declval()));
};

template
struct has_hoge: has_hoge_checker::type {};

class X { };
class Y {
public:
    void hoge();
};

extern void* enabler;

template{}>::type*& = enabler>
void test(const T&) {
    std::cout << "This type has hoge() member function" << std::endl;
}

template{}>::type*& = enabler>
void test(const T&) {
    std::cout << "This type doesn't have hoge() member function" << std::endl;
}

int main() {
    X x;
    Y y;
    test(x);
    test(y);
}

おやすみ

引用元 http://viper.2ch.sc/test/read.cgi/news4vip/1422278100/
スポンサードリンク