C++相談室 part132

レス数が950を超えています。1000を超えると書き込みができなくなります。
2017/10/10(火) 00:11:34.01ID:nc/5PI4P0
次スレを立てる時は本文の1行目に以下を追加して下さい
!extend:on:vvvvv:1000:512

C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレにお願いします。

前スレ
C++相談室 part131
http://mevius.2ch.net/test/read.cgi/tech/1501295308/

このスレもよろしくね。
【初心者歓迎】C/C++室 Ver.101【環境依存OK】
http://mevius.2ch.net/test/read.cgi/tech/1500329247/

■長いソースを貼るときはここへ。■
 http://codepad.org/
 https://ideone.com/

[C++ FAQ]
https://isocpp.org/wiki/faq/
http://www.bohyoh.com/CandCPP/FAQ/ (日本語)
VIPQ2_EXTDAT: default:vvvvv:1000:512:----: EXT was configured
2017/11/20(月) 03:12:59.68ID:Y8ntE/6M0
>>878 の続きです。
同じく、テンプレート版
https://ideone.com/LO68r5

にて一点不満におもったことがあります。

>>878 では基底クラスの記述について、
template <typename T>
class Iterator {
public:
virtual T *next() = 0;
};
派生クラスは
template <typename T>
class XXXIterator : Iterato<T> {
public:
T *next();
};
template <typename T> T *XXXIterator::next() { ... }
と書きました。

しかし本当は、基底クラスを純粋に一個にしたいと希望しているのです。
つまり基底クラスにテンプレート引数Tを書きたくない。

class Iterator {
public:
virtual ○○○ *next() = 0;
};
と基底クラスを一つだけにしぼりつつ、
派生クラスにテンプレート引数を使用して記述することは可能でしょうか?○○○に書けるなにかいい記述はないでしょうか?
テンプレート引数を使用した具象クラスに対応する、テンプレート引数を使用しない抽象クラスを書くことは可能でしょうか?
2017/11/20(月) 03:15:21.39ID:mEO8F9pQ0
>>878
付けなくてもいいし、付けても通るってのは私は今初めて知った。
2017/11/20(月) 03:23:45.23ID:mEO8F9pQ0
>>880
強引なキャストで出来る可能性はあるかもしれないけど、
常識的な方法では出来ないと思う。
ただ、そもそもそういう継承関係を作る必要は無いんじゃないか。
2017/11/20(月) 03:26:59.22ID:Y8ntE/6M0
>>879
ありがとうございます。
meyers の effective C++ 第7章を読み返しています
C++ には Java の fainal がないので、うっかり、std::string や std::vector を派生させてしまうところでした、危ないなあ…
2017/11/20(月) 03:30:13.52ID:iECo0Ul80
>>868
混乱するならシンプルに設計したら?例えばこんな感じ?登録して表示するだけなら簡単でしょ?
#include <stdio.h>
#include <string>
#include <vector>
class Book{
public:
std::string name;
Book(std::string _name) : name(_name){}
void show(){printf("%s\n",name.c_str());}
};
class Books{
public:
std::vector<Book *>m_list;
Books(){}
~Books(){for (auto p : m_list) if (p) delete p;}
void addBook(Book *p){m_list.push_back(p);}
};
int main(){
Books books;
books.addBook(new Book("aa"));books.addBook(new Book("bb"));
books.addBook(new Book("cc"));books.addBook(new Book("dd"));
for (auto p : books.m_list) p->show();
// iterator使いたいなら
//for (auto it = books.m_list.begin(); it != books.m_list.end; it++) (*it)->show();
return 0;
}
2017/11/20(月) 03:34:54.09ID:mEO8F9pQ0
>>880
Java のことはあまり知らんので元ネタにした Java 版の方をよく見てなったけど、
interface のかわりに抽象クラスを使おうとしてたのか。
似たような機能に見えちゃうかもしれないけど、インターフェイスを強制する方法としては抽象クラスはあまり良くない。

C++ 的にはコンパイル時にディスパッチする多相と実行時の多相があって、
抽象クラスは実行時にディスパッチする仕組みなのでコンパイル時に確定するはずのことを実行時にするのはクソザコという風潮。

だけど「コンセプト」の機能が C++ に導入されるのが延び延びになってていまだ入ってないので、
traits とか SFINAE とかを使ったまわりくどいメタプログラミングで代用してるのが実情なんだ。
2017/11/20(月) 03:45:45.65ID:Y8ntE/6M0
>>881
>付けなくてもいいし
うーん、デストラクタの場合はテンプレート引数をつけないとおこられちゃいます…
×https://ideone.com/x5FrwU 69行目
https://ideone.com/FUJ3OO 69行目
よくわらからないな…
2017/11/20(月) 03:53:09.38ID:mEO8F9pQ0
>>886
いや、型名の方には付ける必要あるよ

×:
template <typename T> TShelf::~TShelf() { delete [] (this->t_s); }

〇:
template <typename T> TShelf<T>::~TShelf() { delete [] (this->t_s); }

△: 知らんかった
template <typename T> TShelf<T>::~TShelf<T>() { delete [] (this->t_s); }
2017/11/20(月) 03:57:21.44ID:Y8ntE/6M0
>>884
はい、すごくよくわかります!!
std::vector とか、std::list とかstd::deque とかは、たぶんいけると思います。
http://mevius.2ch.net/test/read.cgi/tech/1434079972/14
http://mevius.2ch.net/test/read.cgi/tech/1434079972/19

なんとなくデザパタ本を読み返していて、車輪の再発明に没頭してしまいましたが、C# のデザパタ本、というのも聞かないし、もうデザパタは古いのかな…
2017/11/20(月) 03:58:54.21ID:O993TKuI0
マジか

役に立つ日が来るかどうかはシランケド
2017/11/20(月) 03:59:06.77ID:Y8ntE/6M0
>>887
ありがとうございます。確認いたしました。
2017/11/20(月) 03:59:26.41ID:O993TKuI0
>>887
2017/11/20(月) 04:12:32.38ID:Y8ntE/6M0
>>885
夜遅くにコメントいただきありがとうございます。

>C++ 的にはコンパイル時にディスパッチする多相と実行時の多相があって、
理解できます。コンパイル時に確定できるのなら最大限それに努める思想はたとえば constexpr にも現れていると思いました。

>抽象クラスは実行時にディスパッチする仕組みなのでコンパイル時に確定するはずのことを実行時にするのはクソザコという風潮。
うーん、たぶん私が周回遅れなだけだと思いますが、じゃあ、ひところ、あれほどまでにもてはやされたデザインパターンは、どこにいってしまったのでしょう…もう誰もやらないのかな…
2017/11/20(月) 04:13:43.35ID:mEO8F9pQ0
>>887
なんでこうなってるかっていうのは割と感覚的にやっちゃってるからうまいこと説明できひんのやけど。
クラステンプレートの中に関数テンプレートも書けたりするので

template<class T>
class foo {
public:
template<class U> void bar(void);
};

実装書くときはどれがどれに掛かってるかわかるようにせんといかん

template<class T> template<class U>
void foo<T>::bar(void) {
}

みたいな話なんじゃないかとコンパイラの気持ちになる仁奈ちゃんの気持ちになってた。
2017/11/20(月) 04:30:34.82ID:mEO8F9pQ0
>>892
抽象クラスを使うパターンなんてのがあるわけ? GoF 本とか読んだことないから知らんけど。
それはインターフェイスをまとめた何かを作れって話とかじゃないの?
C++ の抽象クラスを使えって話とは違ったりしそうだけど。
デザインパターンはあくまでデザインの話なんだから言語の具体的な機能はその時代に有るものでやるしかないし、
よりよい機能が提供されるようになったら使うだろ、そりゃ。

抽象クラスを使うやり方しかできないなら「デザイン」を学び取れてないってこった。
まあ今は C++ への理解も十分でないからってのもあるだろうけどさ。

ところで QZ って C++ スレの常連みたいに思ってたけど、
その割にアレなのでひょっとして共通トリップだったりするの?
2017/11/20(月) 04:42:32.81ID:Y8ntE/6M0
>>894
>その割にアレなのでひょっとして共通トリップだったりするの?
単に、あれよあれよと、また、次から次へと忘れていくので、ぜんぜん進歩しないだけなのでした。
こんな感じ… https://www.youtube.com/watch?v=Hflpt1-kAl4
2017/11/20(月) 07:05:19.03ID:8Dez9ldp0
手元に古いGoF日本語訳(1999年初版)があったので覗いてみたら、
Iteratorのサンプル(C++)が>>880みたいに抽象クラスで実装されていてびっくりした。

抽象クラスを使わなくても、処理の共通化を考えないなら問題ないし、
共通化したい場合でも、そこだけテンプレート化すればよいような気がする。
https://ideone.com/sFzBq4
897デフォルトの名無しさん (ワッチョイ 4178-kX9V)
垢版 |
2017/11/20(月) 08:00:57.16ID:GfOPAtNP0
VC++とか今でこそまともだけど昔はテンプレート周りがうんこすぎて風呂釜洗剤教の人のやり方に頼らざるを得なかったらしいね
898デフォルトの名無しさん (ワッチョイ 826e-Eq1o)
垢版 |
2017/11/20(月) 09:24:05.14ID:9q5rB25R0
そういう「まとも」を求めてVCを選ぶのは情弱のすることだ
意味の違う「まとも」で定評のあるコンパイラであって
899デフォルトの名無しさん (ワッチョイ f9b3-AWKa)
垢版 |
2017/11/20(月) 09:46:04.69ID:Veq8ZMOx0
Vistaまではgccでコンパイルしてたらしいからな。
900デフォルトの名無しさん (アウーイモ MM05-0x9U)
垢版 |
2017/11/20(月) 10:17:12.94ID:5dn4op1oM
初心者なんですがusing使い方を教えて下せえ
2017/11/20(月) 10:36:08.17ID:Fx3rJ6pW0
usingは時代によって使える機能が異なる
昔はnamespaceから使える宣言を取り出す役割
最近は=を用いてtypedefの簡略化っぽい書き方が出来る
2017/11/20(月) 10:42:51.51ID:Fx3rJ6pW0
将来的にはusingがプロパティの役割まで担ってくれると余計な予約後増やさなくて済む希ガス
2017/11/20(月) 12:17:25.71ID:OatlO4rKM
>>897
最初なんてタダのマクロだったし、
4.xだってテンプレート使うと名称長さ制限にかかったり
STLのBUGは何時までたってもそのままだし
904デフォルトの名無しさん (ワッチョイ ae6e-Eq1o)
垢版 |
2017/11/20(月) 14:57:25.95ID:ZHV8ZCmh0
ratioのバグとかinitializer_listとかね
しっかりしているようで時おり大ボケで笑いを取る謎な会社だ
2017/11/20(月) 16:59:42.71ID:CB3KD7K4p
>>883
重箱の隅だけどC++にもfinal導入されたよ、C++11からだっけ
stlに付いてるかどうかは覚えてないけどw
906デフォルトの名無しさん (ワッチョイ ae6e-Eq1o)
垢版 |
2017/11/20(月) 17:06:25.94ID:ZHV8ZCmh0
重箱の隅じゃあんめえ
仮想デストラクタがないことと継承禁止は近いが違う
2017/11/20(月) 17:20:13.60ID:mEO8F9pQ0
std::vector とかを public 継承してもスライシングが起こらないように使う分には全然問題ないわけだしな。

でも人間はアホだからスライシングするし、スライシングしたときにコンパイルエラーにしてくれないから避けようっていう「習慣」なだけで、
言語機能としてはデストラクタが仮想になってないからといって継承が禁止されているってわけではないんだ。
そこらへんは確かに意味づけが違う。
2017/11/20(月) 17:54:47.05ID:4sV97R+K0
デザパタは基本的にGC言語向きだしな
C++とは相性が良くない
2017/11/20(月) 19:05:49.28ID:RcaXyFV8d
C++の基本的なコーディングを学ぶのにオススメな書籍あるかな?
テクニック集とかもあると読んでみたいと思っている
910デフォルトの名無しさん (ワッチョイ a17f-8CrJ)
垢版 |
2017/11/20(月) 19:11:23.76ID:q0WTO8Pn0
EffectiveC++シリーズ
Exceptional C++
C++ Coding Standards
あたりの定番中の定番でいいだろ
2017/11/20(月) 20:12:37.95ID:rJCmscgl0
ここって本職でやってる人らばっかりなんかね
日曜プログラマが気安く書き込んでもいいのだろうか
2017/11/20(月) 20:21:38.03ID:mEO8F9pQ0
>>911
いいよ。 俺も趣味プログラマだけど偉そうに書き込んでるし。
2017/11/20(月) 21:53:59.25ID:gqHMI2DN0
GoF本のうち
Stateパターンは抽象クラス必須
Abstractなんちゃら系も抽象クラス必須
な印象
2017/11/20(月) 22:05:37.00ID:vFwnmuVP0
>>911
プロがここでうんちく垂れてたら引くわな
2017/11/20(月) 22:07:59.95ID:H8zFncfx0
>>873
最新版で該当ケースを探せず、
わざわざ5年前の版を持ち出してきてまで俺ツエーしたいヘタレを相手にしてしまい、すいませんでしたー
gcc4.4.7(2012/3/13)の時点で対応できて無いという情報はものすごく役に立ちますー(棒)


つかマジで、賢いつもりなら最新版で該当ケース探してgccに報告しろよ。
問題に遭遇したらとりあえず最新版、というのは基本だ。
ここを問題視する奴がgcc4.4.7なんて今使ってるわけないだろ。お前は馬鹿なのか?
お前のその努力は誰の為にも役に立ってないだろ。

これは多分に政治的問題で、コンパイラ屋がごねているだけだ。
既に言ったとおり、
reinterpret_cast相当のことがなされている場合、その関数単位で -fno-strict-aliasing すればいいだけで、
これに関して技術/仕様的問題は何もない。
ただ、「ソースさえ正しければこんな問題は発生しない」とか言って、コンパイラ屋がごねてるんだよ。
だから、力関係が逆転すればいきなり全部直ってもおかしくない。

gcc7.2.0がどっちのアプローチ、
つまり、上記の通りばっさり最適化を切ってしまい、最適化ケースを積み上げる方向にしたのか、
或いは従来どおり、過度の最適化を検出し、最適化を防ぐケースを積み上げることにしたのかは、俺は知らない。
ただ、どちらのケースであっても、最新版で上手く行かないケースがあれば、それはgccにとっては有用な情報なんだよ。
それをわざわざ旧版で、しかも隠してしれっととか、意味無いしせこいわw
最新版で出現しないから焦ったか?小物感ありあり。

> まぁそんなことは無いんだけどさ。
とか言うから、お?釣りか?ならここは全力で釣られてやるさ、該当事例持って来いよ!って流れなのに、
事前に該当事例用意しておかずに釣りとかアホかテメーは。
君が最新版で完全にアウトなケースを用意してれば、ああこれは完全に俺の負けですサーセン、とお後がよろしかったのに、
gcc4.4.7であることにも触れず俺ツエーするとか、小物過ぎて泣ける。
お前もうちょっとスレの流れを考えろよ。
2017/11/20(月) 22:13:38.04ID:cvRta7BJM
>>908
GoF本はc++とsmalltalkだったろ
2017/11/20(月) 22:48:11.84ID:gqHMI2DN0
テンキー風のボタンの並びでモードによって意味が変わる(Num Lock ON/OFFのもっと複雑化したようなやつ
というユザーインターフェースの実装はStateパターンのどくだんば

そこまでレトロなのでなくてもGUIでお絵かきツールを集めたツールボックスなUIとか作ると
Abstructなんちゃらパターンのどれかを再発明しているケースが多いと思う
2017/11/20(月) 23:04:17.12ID:vFwnmuVP0
←なぜか変換できない
2017/11/20(月) 23:35:39.24ID:mEO8F9pQ0
独擅場 ← どくせんじょう
2017/11/21(火) 00:48:45.97ID:KkY90WH60
>>913
昨日 >>885 でまわりくどいメタプログラミングと言ってたのがそれだ。
State パターンのように特定のメンバ関数を持っていることを強制したいときには
それを判定するトレイツを作って対応する。

たとえば >>886 にあるコードを対象に考えて、
「あるクラスがそのクラス自身のポインタを返す next という名前のメンバ関数を持っているか」
を判定するトレイツはこうなる。

template<class T>
class has_next {
template<class U, class V = T>
struct helper : std::false_type {};

template<class U>
struct helper<U, typename std::enable_if<std::is_same<decltype(std::declval<U>().next()), U*>::value, T>::type> : std::true_type {};

public:
static const bool value = helper<T>::value;
};

C++ 標準の type_traits を真似してるので使い方もだいたい同じ。

static_assert(!has_next<TShelfIterator<Book>>::value, "TShelfIterator must has next() method.");

みたいに書いておけば TShelfIterator<Book> がメンバ関数 next を持っていることが保証される。
持っていなければコンパイル時にエラーになるから。

ここではひとつのメンバ関数を判定するだけのものを作ったけど、 Boost にはもっと汎用的にいい感じにかけるやつが有った気がする。
知らんけど。
2017/11/21(火) 01:13:43.73ID:H+r6aFWv0
そんなくそレガシーなtraits
久々に見た…
2017/11/21(火) 17:31:41.16ID:6BA+Ife8d
あるファイルに下のような文字が書き込まれていて
xxxx=3
これの3を取得する完璧無欠なロジックなにかないかな
923デフォルトの名無しさん (ワッチョイ 4178-kX9V)
垢版 |
2017/11/21(火) 17:32:59.03ID:uRVBPn0b0
完璧無欠とは?
2017/11/21(火) 17:36:16.46ID:6BA+Ife8d
>>923
俺様のアルゴリズムは完璧だぜ!!!
ってだけ
まあそんなのないんだけど書き込みたかった
2017/11/21(火) 18:10:16.89ID:B2ib4/wIa
正規表現でよくない?
2017/11/21(火) 19:05:58.85ID:DIhAB+/L0
リバースイテレータをfindしてイコールでセパレート。
って、数行から見つけるのか。
構文解析とかか?
2017/11/21(火) 19:38:49.19ID:6BA+Ife8d
>>926
数行から見つける
設定値の中から見つける
実際は


#xxxはdddの設定値
xxx=1

#yyyはcccの設定値
yyy=3

こんなのが繰り返し書かれてる
正規表現確かに良さそう忘れてた
2017/11/21(火) 19:53:50.67ID:GhiisSyt0
(?<=^xxx=)\d+$
2017/11/21(火) 20:30:32.65ID:0pu32Yjt0
float演算がdoubleよりも遅いってアジですか?
2017/11/21(火) 21:02:58.77ID:xJ15vzkZ0
>>929
何が計算するかによる、としか
2017/11/21(火) 21:12:53.35ID:0pu32Yjt0
さいですか
2017/11/21(火) 21:19:38.81ID:muR8Mwv6r
>>922
ほれ
https://wandbox.org/permlink/YK6UEOGxMToYE1SK
2017/11/21(火) 21:44:16.41ID:6BA+Ife8d
>>932
すんごく綺麗なコードありがとう
見事に魔改造して糞コードにしてしまう自信がある
934デフォルトの名無しさん (ワッチョイ a980-61Vg)
垢版 |
2017/11/21(火) 21:55:27.92ID:6jcLJvUW0
>>927
そういう設定ファイル的なものを読むならkeyとvalueのペアのリストつまりmapを返す実装を考えた方がいい
2017/11/21(火) 22:16:59.77ID:6BA+Ife8d
>>934
俺もそうは思ってるのだけどその読み込む処理をどうしたら綺麗にできるかなぁって悩みなんだ
マップ作ったあとに検索が綺麗なのかなとは思ってる
2017/11/21(火) 22:33:26.16ID:KkY90WH60
文法的には LL(1) かな?
素朴なパーサコンビネータでも充分に足りるのでその手のライブラリを導入すると楽にパーサを作れると思う。

それはともかく、「>>922 みたいな」というだけの仕様では

・数値以外が設定値にくることもあるのか?
・要素に改行を含められるのか?
・エスケープも出来るようにするのか?

等々が読み取れないし、多分 >>922 は考えてないんじゃないかなと思う。
オレオレ設定ファイルフォーマットを考えるくらいなら TOML とかいったよくあるフォーマットを採用すれば
ライブラリが充実してたりして便利なので考えてみるといいかも。
937デフォルトの名無しさん (ワッチョイ 4178-kX9V)
垢版 |
2017/11/21(火) 22:42:43.82ID:uRVBPn0b0
ってかboostのPropertyTreeにiniパーサーがあるからそれ使うといいよ
2017/11/21(火) 22:42:58.28ID:6BA+Ife8d
>>936
回答すると
数値以外もありうる
改行は値として入れない
エスケープってなんだろう?
xxxに関しては最大16文字の文字列(大文字小文字計52文字の組み合わせ)

たったこれだけでも深いね
ソフトウェアって神秘
2017/11/21(火) 23:00:05.88ID:GhiisSyt0
ini-parserてのがなかなか良さそう
picojson,rapidxmlなどが好きな人にはいいかも
2017/11/22(水) 02:34:39.84ID:9vladmL60
構文解析したいならbisonでも使ったらいいんじゃね?
941デフォルトの名無しさん (ワッチョイ f9b3-AWKa)
垢版 |
2017/11/22(水) 03:34:34.44ID:ft6g9THr0
ム板で公開されたのがあったじゃないか。
2017/11/22(水) 10:29:13.01ID:wHcXBwMz0
>>938
>>922の完璧無欠なロジックてのは
最初に完璧無欠な入力規則を作ってから議論できるものだろ

>数値以外もありうる
数値だけでもいろんな型があるわけだしこの程度じゃ何も語れない
xxxx=3のような単純な形式はINIファイルとか>>936のようなのとか利用するのが便利
最近はXML形式が推奨されてる
ただしどれもが完璧無欠とは言えないけど
943デフォルトの名無しさん (ワッチョイ a980-61Vg)
垢版 |
2017/11/22(水) 10:59:36.64ID:jvBgNmmT0
>>942
どこの最近?
2017/11/22(水) 11:55:13.96ID:/unloUf+0
XMLは配列が直接表現できないし手で書くのがクソめんどくさいし見づらい
その点JSONの方がずっとマシなんだけど標準JSONだとコメント書けない
2017/11/22(水) 12:48:47.95ID:PiUoYWXr0
適材適所、の一言で片付く問題
好きな方使え
946デフォルトの名無しさん (ワンミングク MM52-61Vg)
垢版 |
2017/11/22(水) 13:52:54.31ID:gFgFfMOWM
人が書く設定ファイルならtomlがパースのしやすさと書きやすさでバランスが良いと思う
2017/11/22(水) 16:17:23.80ID:HDCbnteD0
>>946
dein.vimで使われてるの見て知ったけどまったくと言っていいほど広まらないね

>>944
ド定番のYAMLでいいじゃん
2017/11/22(水) 20:12:53.57ID:Rn9KsJdK0
Cargo の設定ファイルも TOML やぞ。 モダーンな言語のモダーンなツールは TOML がトレンド。 これ。
YAML みたいにインデントで構造を表現するのってパースめんどくさい。

個人的に YAML は不格好に見えて好きじゃないっていう主観もあるんだけど、
YAML ってそんなに定番ってほど目にしたことが無いな〜と思って考えたら
たぶん俺の巣は Scheme スレやからやな。
Lisp 界隈では設定ファイルにはS式を使ってまうもんな。
2017/11/22(水) 21:00:11.47ID:h+KIZtFy0
luaなんかもよく使われるけど、schemeやluaが設定ファイルとして使われるのは
呼び出し側の言語が同じであるか、他の用途で使うためにすでに組み込んでる場合がほどんどで
設定ファイルだけの為にLL組み込むにはお手軽とは言えないかな
TOMLはいいとは思うんだけど
自分が使うなら仕様が固まってからの1.0〜は必須で
↓で300程度は使われてからかな

$ apt-file search toml | grep "\.toml$" | wc -l
0
$ apt-file search json | grep "\.json$" | wc -l
3611
$ apt-file search yaml | grep "\.yaml$" | wc -l
1480
2017/11/22(水) 21:10:35.27ID:W0SJQGiTM
最近この手の話題に疎いからtomlとか知らんかったのでちょっとググったけどまあ好きなの使えや
って感想しかないわ
https://gist.github.com/miyakogi/e8631ce5f7c956db2313
2017/11/22(水) 21:16:10.07ID:Rn9KsJdK0
パースの楽さだけで言えば JSON が優勝だけど人が手書きするには色々アレだからな。
2017/11/22(水) 21:20:22.39ID:3/I2dLA90
好きなの使えっつっても全部導入して試すの面倒や
2017/11/22(水) 21:56:28.30ID:+hB2MqUt0
ES5以降ケツコンマOKになったんだからJSONも新規格にすりゃいいのに。
2017/11/22(水) 23:47:16.65ID:AAzHTorM0
>>936
正規表現で済んでいるのになんでスタックが要るんじゃ!!!!!!11!1!!!!
2017/11/23(木) 00:25:32.50ID:fj1LdTry0
>>954
意味がわからないので説明して。
2017/11/23(木) 00:36:02.97ID:h8NdPAUM0
文脈自由文法は解析にスタック(理論上は無限の段数のやつ)が要るクラスだが
正規言語は有限状態マシンで済む言語のクラス
今話題の設定言語は無限の入れ子は持たなそうなので正規言語で逝ける、
2017/11/23(木) 00:37:37.76ID:h8NdPAUM0
と、
言いたいのでわ…
2017/11/23(木) 01:07:08.12ID:fj1LdTry0
ん〜、そのへんの学問的な分類はよう知らんけど、取りうる状態は有限でもバックトラックは起こるしそのためのスタックは要るんちゃう?
同じ文法の構文解析器を作ればどっちのアプローチでもスタックの消費量はかわらんと思うんだけど。

より制限の強い方で「十分」っつーならそれはわかる。 C++ 標準に入ってる機能で出来りゃ楽だしな。
ただ、正規表現ライブラリだとエラーの検出場所の伝達方法とかで融通が利かなかったりするので、
ユーザーが入力する設定ファイルを解析するパーサを作るとなると作りこみ難いという感触があるかな。
2017/11/23(木) 06:39:00.31ID:NFzuGiE50
「チョムスキー階層」でググれ
2017/11/23(木) 07:23:17.08ID:NFzuGiE50
>>958
>ん〜、そのへんの学問的な分類はよう知らんけど、取りうる状態は有限でもバックトラックは起こるしそのためのスタックは要るんちゃう?
非決定性有限オートマトンは決定性有限オートマトンに変換できるので、
バックトラックが一切起こらない形に書き換えることは可能。
lexなんかだと、そのような変換を行ったコードを生成していたはず。
ただし、プログラム言語などで一般的に使われる正規表現は、
ここでいう正規言語を拡張したものなので、この限りではない。
2017/11/23(木) 14:40:51.51ID:QeiOUUJtx
C++のプロジェクトに戻りたい。
2017/11/23(木) 18:06:46.17ID:5yPMgLrz0
どうぞどうぞ
2017/11/23(木) 18:56:01.32ID:h8NdPAUM0
もう次スレ要らないのでは
2017/11/23(木) 19:03:52.53ID:fGVRHt7J0
またまた低レベルな質問で恐縮しております。よろしくお願いいたします。
https://ideone.com/MXvhkC

ここまで実装できている状態で、演算子 += を定義するには、どのように書けばいいでしょうか?
なお実際に作業している対象は自作の多桁長演算ライブラリで、operator+=() を operator=() や operator+() を再利用できればうれしいな、と考えております。
operator+() や operator=() に書いていることを、繰り返して書くのは避けたいと考えているのです。
2017/11/23(木) 19:07:30.71ID:IGgCkWwq0
普通はoperator+=()を実装してから、それを使ってoperator+を実装する
2017/11/23(木) 19:44:55.34ID:fGVRHt7J0
>>965
なるほど
https://ideone.com/t89oo1

しかし、+=, -= ならまだしも、 *=, /=, %= を考えると、なんだか似たようなコードを二箇所に書きそうな雰囲気がします…
2017/11/23(木) 19:54:00.12ID:IGgCkWwq0
だからboostにこんなのがあったりする
https://boostjp.github.io/tips/operators.html
2017/11/23(木) 19:56:33.11ID:5nCr5Wf60
CRTP使って自動実装
2017/11/23(木) 20:01:00.33ID:fj1LdTry0
>>964
なんで friend がついてんの?
2017/11/23(木) 20:17:56.76ID:j5z8beti0
>>967
これってなんでprivate継承なのか分からない
2017/11/23(木) 20:23:32.48ID:fj1LdTry0
>>970
スライシングを起こさないようにじゃないの。
デストラクタを virtual にすると要らん仮想関数テーブルが作られちゃうからな。
それでいて定義する関数は friend 関数にしてるから外側からでも見えるんだな。
2017/11/23(木) 20:46:50.20ID:fGVRHt7J0
>>969
こんな小題でもいろいろと試されるんですね…

たしかに operator+=() は、意味からいっても friend である必要はまったくないですね。
一方 operator==(), operator+() は式の表現としての対象性を保存したいので、friend をつけたいと考えています。
operator<<() に対しては friend を必ずつけないといけないようですが、その理由はよくわかっていません。
https://ideone.com/pR0EP1
973デフォルトの名無しさん (アウアウウー Sacb-DWFp)
垢版 |
2017/11/23(木) 22:59:38.32ID:vKpvx9Uha
IDE使っていて思うのがtemplate関数でデフォルト引数classAを設定すれば、

template<typename T=classA>
void Test(T tmp){
tmp.func(1, 2, 3);
}
上記のtmp.のところでclassAの関数とかが出て来るようになると嬉しいとか思ったり
コンセプトとかで対応できるようになるんでしょうか?
2017/11/23(木) 23:16:02.95ID:WYrOiD8s0
mix-inもまともに知らないやつがなぜ回答してるのか…
2017/11/24(金) 00:17:10.75ID:mELw8YtS0
>>973
言語仕様っていうよりIDEの性能のような。
コンセプトまで構文解析してサジェストするようになれば確かにできるかもしれんけど。
2017/11/24(金) 01:03:21.71ID:/7rxT1Yr0
>>973
技術的には可能だからlibclangでなんとかなるようになるなら誰かやってくれるかもね
コード補完にプラグインを使えないIDEなら開発元にリクエストするしかない
2017/11/24(金) 01:39:31.39ID:Z3szivMI0
mix-inで理解が止まっている人がなんか吼えてますな
2017/11/24(金) 08:42:41.97ID:ZeExn92sr
>>973
コンセプトはシンタックスの誤りを判定するのみで型情報を持っていないため
その補完は期待できない
2017/11/24(金) 09:00:16.20ID:nFkUcp0I0
>>977
boost operatorsのprivate継承がmix-in以外のなんだと思ってるんだ?
レス数が950を超えています。1000を超えると書き込みができなくなります。
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

ニューススポーツなんでも実況