C++相談室 part145
■ このスレッドは過去ログ倉庫に格納されています
C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレにお願いします。
前スレ
C++相談室 part144
https://mevius.5ch.net/test/read.cgi/tech/1563769115/
このスレもよろしくね。
【初心者歓迎】C/C++室 Ver.105【環境依存OK】
https://mevius.5ch.net/test/read.cgi/tech/1556142878/
■長いソースを貼るときはここへ。■
http://codepad.org/
https://ideone.com/
[C++ FAQ]
https://isocpp.org/wiki/faq/
http://www.bohyoh.com/CandCPP/FAQ/ (日本語)
----- テンプレ ここまで ----- >>377
1. constexprにしてもいいんじゃない?
2. 出力関数作成しよう
template<typename Char>
std::basic_ostream<Char>& operator<<(std::basic_ostream<Char>& os, const Fraction& frac){
return os << frac.GetNumerator() <<'/'<<frac.GetDenominator();
} >>378
1.できなくはない。機械的に接頭語つけるだけでいいよね。
2.暇だから作るわ。
行ってきまーす。 https://ideone.com/uzd7EF
ただいまー。イデオンで動かせるようにした。Gcdがバグってないといいなぁ。
あとvc2019では意味不明なエラーで動かない。 C++ってなんでヘッダファイルいるんですか
最近マシン早いんだし
全部ソースに書いてインポートすればいいのに >>384
むしろソースがいらなくて全部ヘッダに書けばいい
inline変数とかもできるようになったことだし >>387
たまに趣味で何でもかんでもtemplateでゴリゴリ実装してるとガチでそれになるww プリコンパイルヘッダーって使ってます?
使っているプロジェクト見たことないですわ。 >>387
こういう馬鹿野郎が出てくるからメタプロとかテンプレ好き連中ってのは嫌いなんだよ。 C++なんて趣味でやってるんだからテンプレ好きでもええやん 出てくることの何が嫌なんだろうか
はっきり言って病気だ headerオンリーってのは可搬性に優れた良いものだろ
特にテンプレート多用している奴は、一部関数だけソースファイル分離する意味が薄い >>391
どんなものにだって馬鹿は出てくるだろうに 「全部ヘッダ」と言われると、そのときの「ヘッダ」の定義がどういうものなのか気になる。 >>390
VCのやつは使いまくり
依存するライブラリのヘッダファイルを標準のやつもソリューション内のやつも全部まとめて
stdafx.hの中でインクルードしたらことのほか便利
ただし同じプロジェクトのヘッダファイルを入れだしたら目的を見失って氏ぬ テンプレート関数は便利だしconstexpr関数は市民の義務だし
結局ほとんどヘッダファイルに書くことになるでしょ 初心者ですが質問させてください
print(1, 3.14, "abc");とやると引数の中身を順番にスペース区切りで出力してくれるような関数は
可変引数テンプレートの再帰呼出しを使うと便利にできることを知りました。
そこで引数の型に応じて出力の見た目を少し変えたいのですが、
関数の特殊化をすればいいですか?
typeidだと動的な評価になってしまうんですよね? 予想通りの馬鹿回答で笑ってしまった。
やっぱいい判別になるわテンプレバカ。 >>400
引数一つに対するテンプレート関数を作って特殊化してそれに少しずつ渡せばできるよ。 C++嫌いなのにいつまで居座るんだろうなこのガイジ こんな雑談スレ好きな奴以外に需要ないだろ
こんな辺境別に見なくて良いんだよ? >>400
c++17以降ならif constexprとstd::is_same_vの使用を検討してみるのもいいかも 400です。頑張ってみましたがどうにもコンパイルエラーが出ます
難しいですねC++は...
void print() {}
template<class... Args>
void print(const char* c, Args... args) {
cout << "[" << c << "]" << endl;
print(args...);
}
template<class First, class... Args>
void print(First first, Args... args) {
cout << first << endl;
print(args...);
}
int main() {
print(1, 3.14, "abc");
return 0;
} あ、こういうふうにするとコンパイルできました。引数2個の関数を特殊化したからエラーになった?
テンプレートの展開のされ方がよくわからないけど、とりあえず目的のことはできました
ありがとうございました
void print(const char* c) {
cout << "[" << c << "]" << endl;
}
template<class T>
void print(T t) {
cout << t << endl;
}
template<class First, class... Args>
void print(First first, Args... args) {
print(first);
print(args...);
} >>406
いわゆる型特性というやつでしょうか?enable_ifを使うのかと思い試したもののうまくいかず、
ネットで調べるとenable_ifと可変引数テンプレートは相性が悪いという意見を見つけたり... >>409
if constexprを使った例はこんな感じ
template<class First, class... Args>
void print(First first, Args... args) {
if constexpr(std::is_same_v<First, const char*>){
std::cout << "[" << first << "]" << std::endl;
} else {
std::cout << first << std::endl;
}
if constexpr(sizeof...(args)>0){
print(args...);
}
} const char * 自体も class First や class Args と一致するんじゃね First と Argsの二つがあるのがややこしい場合は畳み込み式でもできるぞ
template<class... Args>
void print(Args... args){
([](auto t){
if constexpr(std::is_same_v<decltype(t), const char*>){
std::cout << "[" << t << "]" << std::endl;
} else {
std::cout << t << std::endl;
}
}(args), ...);
} win系のOSの画面に1.txt~5.txtがあります。1.txtと2.txtをドラッグして選択したとします。
この状態で3.txt~5.txtを選択したことにするにはどのようなコードを書けば良いですか? >>413
ListView_SetItemState std::shared_ptrを構築後に(カスタム)デリータを変更するのは無理?
既にどっかで作成済みのshared_ptrについて、破棄タイミングを後から見れないかなと 別のstd::shared_ptrをカスタムデリータ付きで構築してswapすれば shared_ptrとunique_ptrでdeleterの指定方法が違うってのが興味深いね。 VCのlatestでchar8_tが入ってたわ
やっとC++erが文字コード問題から解放されるんだな >>418
デリータごとswapされたわ
stackoverflowにも似たような質問があったけど結論としては出来ないっぽい
たぶん >>392
別にテンプレ好きでも構わんが、C++ユーザー全員が趣味だと思ってんの? >>405
雑談以外に役に立つ書き込み出来なくてすみません、ってことか >>423
C++ユーザが全員趣味なんてどこにも書いてないし、あるプログラミング言語が趣味でしか使われてない状況なら、委員会なんていらないわwww 衣食住の確保以外の仕事なんてみんな趣味みたいなもんだよ
なくたって構わんのだから 委員会なんて何の役にもたってねーだろ。
構文解析もまともに理解できてないバカが俺様仕様の理想に突っ走ってるだけのクソ組織で、
仕様の実装、デバッグの手間なんてこれっぽっちも考えてないのがよくわかる。 デバッグできねえのを人のせいにするクズがよく言うぜ 近年は新機能は三大コンパイラ(GCC,MSVC,Clang)での試験実装が入ってから仕様入りするのが普通になってるし
コンセプトなんてまさにデバッグの手間の軽減を第一目的に苦心して作られた機能なんだけど
どのへんを見てよくわかったのか教えて >>431
実装したことないやつは黙っててね。
で、そのコンセプトを実際のコードでコンパイルした時間がどれくらいになるかわかってる?
そういう有用なベンチマークもほとんど出さずに無理やり入れようとするから
信頼を無くしてるんだよ。 経験したことは全て正しいっていう日本特有のアホ理論だろそれ
経験してないお前に発言権は無い、っていう
その理屈を持ち出すヤツは大抵はアホ コンパイル時間は、コンパイラの出力する最適化されたバイナリの実行速度に比べたら問題ではないだろ
しかも構文解析にかかる時間なんて最適化時間に比べりゃ屁みたいなもの 似たようなものを複数書いてもバグ修正時に一部見落としなんて馬鹿げたことになるわけで
マクロでもテンプレートでもまとめられるものはまとめたほうがいいわな c++言語の場合、パースのコンテキスト依存が、識別子の種類でも変わるから、テンプレート時の記述でtypename やらtemplateやらで、識別子の種類自体を指定する羽目になっているのはあるよね >>434
テンプレートふんだんに使ったライブラリ実用してるとひどいことにはなる
アプリ自体は数万行なのにコンパイル10分以上とか >>432
お前が信用しないのは勝手だが、みんなの総意みたいに言うなよ それは本当にパースの複雑さのせいなのかは疑問だな
templateだと、プログラマは簡単にコンパイラの仕事をあまり意図せず増やしてしまいがちだからね。
std visitで引数増やすとコンパイル時間は簡単に増やせるよ。
5つくらいでもうコンパイラが落ちたりする
やらせていることの面倒くささ、それを手書きすることを考えれば妥当なのだけど 最近C++触ってないけど数万程度で10分もかかるの?
10万行程度なら5分以内に終わってほしいところだけど… >>439
かなり遅いです。
ヘッダファイル *.h とソース本体のファイル *.c では事情が違いますが、
OSのバージョンによりますが、Win32の標準ヘッダファイルの windows.h などだけでも
コメントを除外しても2万行弱くらいあります。
これのパースは、VC++で1秒〜数秒くらいです。
通常は、precompiled header を使うので、一つのプロジェクトで一度だけ
パースされることが多いです。
ただし、プロトタイプ宣言やマクロ定義、構造体定義、inline関数定義
などだけで、実際のコード生成は伴わないので、*.c の数万行とは
また事情が違います。*.c はコード生成を伴うので、同じ行数であれば*.hよりも
遅くなる傾向があります。
しかし、それでも、C++98 の場合、数万行だと3秒〜10秒以下でコンパイルできます。 c++の文法のせいでパースが遅いってレベルの話じゃないような ヘッダオンリーのライブラリがポータブルとか言われてもてはやされるのがc++だからね
生産性の意識が間違った方向に向いてる
コンセプトでどうなることやら 俺の10万行程度のアプリは1分以内にコンパイル終わるが・・・
10分てどこの世界だ 「参照の配列」を作りたいときって現状 reference_wrapper を使う以外ないですか? >>437
プリコンパイルヘッダー使え…!
>>446
VC++2010の場合配列要素のアドレスの配列というのを
それぞれ1万行ぐらい書いてリリースビルドすると10分かかる spiritで構文解析させてたコード(その上et使った自作ライブラリあり)だから例として極端だったかもしれんけどね
プリコンパイルドヘッダは使ってたよ
効いてるときは数分かからなかったと思う
というか5年以上そのコード使ってないんで今のマシンならまだマシになるとは思う boostを多用した10数万行のソースでprecompileありでreleaseビルドしたら10分くらいかかってたけど、debugビルドでは1,2分くらいだった気がする。パースだけなら大したことないけど最適化がかなり遅いと思われる。 翻訳単位が増えると単純に遅くなるし
リンク時最適化でもさらに遅くなる LTOは本当のリリース時や速度検証の時以外は外しても問題ないよね ここの話で出ている
>296
>>294
clangさんが教えてくれた
std::string hogehoge() { return A<_T3>::template get<std::string>();}
>436
c++言語の場合、パースのコンテキスト依存が、識別子の種類でも変わるから、
テンプレート時の記述でtypename やらtemplateやらで、
識別子の種類自体を指定する羽目になっているのはあるよね
<_T3>::templateやtypenameをどの様な場合に書かないといけないのか?
この辺を解説した初心者向けか入門者向けの解説サイトみたいな所が
何処かに有りませんか?
サイトが無さそうなら検索に向いている単語みたいなのでも有れば助かる
::templateとかで検索しても上手く引っ掛からないみたい(有るには有るけど少ない) 他の言語で書かれたコードをスクリプトの要領で
C++から呼び出して実行したいのですが、
そういった事をするのに適した言語ってどういった物があるのでしょうか? 言語間のABIの違いを透過的にしたいのならアセンブラの出番だね >>457
今ならluaかjs(V8/ChakraCore/SpiderMonkey)だな。
【Lua】組み込み系言語総合 その7【Squirrel】 [無断転載禁止]©2ch.net
https://mevius.5ch.net/test/read.cgi/tech/1474536226/
pythonもできなくはないけど手軽とは言えない。
pythonを使いたい理由がなければやめておくのが吉。 pythonは呼ぶ方で、呼ばれる方としてはほとんど想定されてないわな。 >455,456さんどうもです
エラーが出たらそうしてみます
リンク先を読んで見ましたが
自分には難しいのでそのページを手がかりに検索して(依存名で探してみた)
漸く理解出来た気がします
前にstd::を付ける付けないって話を何処かでしてい
自分的にはどうしたものだろうか?
って感じだったんですけど
adlやtwophasenameとかの解説と合わせて書いて有るのを呼んでいて
std::を付けるのはかなり重要なんだと思えてきた
今までnamespaceって単なるグループ名を付けている
くらいの感覚だったんですけど
意外と重要なんですね
どうもでした template<size_t N>
class Test{
public:
private:
int m[N];
};
上の様なクラスでコンストラクタでmを値を指定して初期化したいんだけどNの数は未定ではないですか。
こういう場合のコンストラクタの書き方ってどうすればいいのでしよう?
可変引数? コンパイル時に決まってないならvectorかなんかにするしかない templateパラメータの整数にはコンパイル時に決まらない数値は入れられない >>466
そもそも、そのような生配列は、デフォルトでは0初期化もされないので、
メンバ初期化子リストを使わなくても効率は落ちないので、
コンストラクタ内部で普通に代入演算子を使って初期化すればいい。
すると、単に任意個数の引数をコンストラクタに渡す問題になる。
それには、昔ながらの va_list を使って渡す方法と、
関数テンプレートやテンプレートクラスを使って、自分自身を一つずつ引数を
減らしながら呼び出していく方法の二通りある。 >>466
Test(std::initializer_list<int>&& arg)
{
std::copy_n(std::begin(arg), N, std::begin(m));
} >>469
一度考えたのはテンプレートの可変引数なんですが
//Testのコンストラクタ
template<typename... T>
Test(T... args):m{args...}{
}
templateの可変引数の為にどんな型でも一致してしまい、そのくせにdoubleからintなどの変換をしてくれないのでinitializer_listを引数に出来たり、もしくはもっといい初期化方法があるのかなと思った次第です。 >>471
>そのくせにdoubleからintなどの変換をしてくれないので
この点に関しては、以下の拡張展開でいけるはず。
template<typename... T>
Test(T... args):m{((int)args)...}{
} templateの「非型引数」を使えば、理論上は、
template<int...args>
Test(int...args):m{args...}{
}
と書ける可能性はあるかもしれないけど、試してみてないので分からない。 C++11 から、template 仮引数(パラメーター)に非型パラメーターパックが使える。
分かっているとは思うけど、このパックとは可変長引数をまとめて入れる容器の様な意味。
実際にやってみてないのでわからない。
https://en.cppreference.com/w/cpp/language/template_parameters
【Non-type template parameter】
type ... name(optional) (3) (since C++11)
3) A non-type template parameter pack with an optional name. >>466
要素数がコンパイル時に決まってるなら std::array 使って Test<3> x{{1,2,3}} とすることは簡単にできそう。 ■ このスレッドは過去ログ倉庫に格納されています