[表示 : 全て 最新50 1-99 101- 201- 2ch.scのread.cgiへ]
Update time : 12/02 15:44 / Filesize : 56 KB / Number-of Response : 200
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

C++相談室 part128



1 名前:デフォルトの名無しさん mailto:sage [2016/11/27(日) 00:03:49.04 ID:Hj6igpz/.net]
次スレを立てる時は本文の1行目に以下を追加して下さい
!extend:on:vvvvv:1000:512

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

前スレ:
C++相談室 part127 echo.2ch.net/test/read.cgi/tech/1474636291/

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

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

[C++ FAQ]
https://isocpp.org/wiki/faq/
www.bohyoh.com/CandCPP/FAQ/ (日本語)

■ shared_ptr で 標準ライブラリのFILE構造体ポインタをラップしよう
class FILE_Ptr : public shared_ptr<FILE> {
 struct FILEDeleleter {
  void operator() (FILE* fp) const { if (fp != NULL) { fclose(fp); }}
 };
public:
 FILE_Ptr(FILE* fp = NULL) : shared_ptr<FILE>(fp, FILEDeleleter()) {}
 operator FILE* () { return get(); }
 template<typename T> bool operator == (const T& obj) const { return get() == reinterpret_cast<FILE*>(obj); }
 template<typename T> bool operator != (const T& obj) const { return get() != reinterpret_cast<FILE*>(obj); }
};

142 名前:デフォルトの名無しさん [2016/12/01(木) 10:05:27.69 ID:PTAZcCnS.net]
>>139
ほう?
この例え話から建設的な議論を広げて貰おうか?

143 名前:デフォルトの名無しさん mailto:sage [2016/12/01(木) 12:54:22.29 ID:rYSe/HxL.net]
>>142
そう言うレスが建設的じゃないって言われてるんだろ

144 名前:デフォルトの名無しさん [2016/12/01(木) 13:02:57.96 ID:PTAZcCnS.net]
>>143
え?なんで?
出来ないこと要求しちゃったから?

145 名前:デフォルトの名無しさん [2016/12/01(木) 14:01:09.15 ID:vPHgqg3S.net]
template<typename T> struct moge
{
struct hage{};
};
template<typename T> void hoge(typename moge<T>::hage)
{}
hoge(moge<int>::hage{});

hogeの呼び出しができません。hogeをどう変えればいいですか。

146 名前:デフォルトの名無しさん mailto:sage [2016/12/01(木) 15:05:36.97 ID:SwKXepyG.net]
>>145
hoge<int>(moge<int>::hage());

147 名前:デフォルトの名無しさん [2016/12/01(木) 15:17:40.11 ID:vPHgqg3S.net]
呼び出しの方は変えたくないです
Tがどの型でも呼び出せるようにするにはどうすればいいですか

148 名前:デフォルトの名無しさん mailto:sage [2016/12/01(木) 15:38:14.38 ID:O+yJrb2h.net]
俺はテンプレートなんか自分ではめったに書かないし
テンプレートの型推論のメカニズムも何も知らないが
要はhoge()の中でTが得られれば良いんでしょ?

template<typename T> struct moge
{
struct hage{ typedef T type; };
};
template<typename U> void hoge( U arg )
{
typedef U::type T;
}
hoge(moge<int>::hage{});

一応これでコンパイルは通る

149 名前:デフォルトの名無しさん mailto:sage [2016/12/01(木) 15:39:23.16 ID:X/1wKSRH.net]
>>101
拾いきれない例外は外にふっとんでいく

150 名前:デフォルトの名無しさん [2016/12/01(木) 15:41:27.17 ID:SwKXepyG.net]
>>141
正社員より年収の良い派遣社員だよ、basic_stringさんは。
しかも、boost の文字列操作ライブラリの強力な支援を受けられる最強の八方美人。



151 名前:デフォルトの名無しさん [2016/12/01(木) 15:42:30.64 ID:vPHgqg3S.net]
それだとtypeを持った型ならなんでも受け付けてしまいます
mogeのhageしか受け付けないhogeが必要です

152 名前:デフォルトの名無しさん mailto:sage [2016/12/01(木) 16:29:20.65 ID:aVqOQbdr.net]
コンパイラ無いから試せないけど、呼び出しに{}いるんだっけ?

153 名前:デフォルトの名無しさん [2016/12/01(木) 16:59:12.87 ID:umvXirxE.net]
clang: candidate template ignored: couldn't infer template argument 'T'

gcc: candidate: template<class T> void hoge(typename moge<T>::hage)
template argument deduction/substitution failed:
couldn't deduce template parameter 'T'

cl:
'hoge': no matching overloaded function found
'void hoge(moge<T>::hage)': could not deduce template argument for 'T'
see declaration of 'hoge'

みんな口を揃えて「Tが推定できない」と言ってくる
じゃあ、Tを明示的に与えては?
hoge<int>(moge<int>::hage{});
ちょっと腹立つけど、typenameだのtemplateだのの前置と
ウザさはそう変わらんと思う

154 名前:デフォルトの名無しさん [2016/12/01(木) 17:04:30.75 ID:umvXirxE.net]
ヘルパー関数を用意するとか
template <typename T>
void hige()
{
hoge<T>(moge<T>::hage{});
}

155 名前:デフォルトの名無しさん [2016/12/01(木) 17:06:57.95 ID:umvXirxE.net]
ラムダ式でも似たようなのできるな
auto closure = [](auto arg){ hoge<decltype(arg)>(moge<decltype(arg)>::hage{}); };
closure(1);

156 名前:デフォルトの名無しさん [2016/12/01(木) 17:12:07.19 ID:vPHgqg3S.net]
hoge(moge<int>::hage());
呼び出し方はこうでないといけないのです
hogeの定義の方をなんとかしてできませんか

157 名前:デフォルトの名無しさん [2016/12/01(木) 17:20:15.24 ID:EvfhiEON.net]
template<typename T> struct moge {
struct hage{ using type = T; };
};

template<typename T>
std::enable_if_t<std::is_same<T, typename moge<typename T::type>::hage>::value>
hoge(T) {};

158 名前:デフォルトの名無しさん mailto:sage [2016/12/01(木) 18:08:07.28 ID:rYSe/HxL.net]
すでに終わった話を引っ張るのが建設的とはとても思えないんだが...
まあ、なんか悔しいんなら一人でやっててくれ w

159 名前:デフォルトの名無しさん mailto:sage [2016/12/01(木) 18:49:53.87 ID:Xkx3qm7U.net]
>>157
hoge関数をどう変えるかと聞いてるのに
勝手にmogeの定義を変えるお題改変野郎

160 名前:デフォルトの名無しさん mailto:sage [2016/12/01(木) 19:01:40.82 ID:aVqOQbdr.net]
>>156でなんか問題あるの?



161 名前:デフォルトの名無しさん mailto:sage [2016/12/01(木) 19:13:39.34 ID:xNXWtXQs.net]
答えられないと「俺のお題改変に文句付けるのか」
「何が気に入らんのやワレ」と圧力

162 名前:デフォルトの名無しさん mailto:sage [2016/12/01(木) 19:14:31.57 ID:O+yJrb2h.net]
>>159
現実問題としては、using type = T は無くても有ってもかまわないんだろうよ
実際のコードのhageの中身がどうなっているかわからないが
Tを使ったメンバがあるならdecltypeでTは取得できるし
Tを使ったメンバがないなら
おそらくはhageの処理をするのにTは要らない公算が高いだろ
hoge()が何をする関数かわからないから何とも言えないが
using type = T はサービスみたいなものじゃないかな

163 名前:デフォルトの名無しさん [2016/12/01(木) 19:15:49.51 ID:vPHgqg3S.net]
>>160
コンパイル通りません
153のようなエラーが出ます

164 名前:デフォルトの名無しさん mailto:sage [2016/12/01(木) 20:31:23.58 ID:O3rxu16z.net]
>現実問題としては、using type = T は無くても有ってもかまわないんだろうよ

質問者以外の者がどうして根拠なしに決めつけようとするのか疑問だ
math.hにM_PIを入れただけで因縁をつけられてしまうというのに

165 名前:デフォルトの名無しさん mailto:sage [2016/12/01(木) 21:42:58.03 ID:O+yJrb2h.net]
だから質問者に良いかどうか決めてもらえばよいだろって話
質問者が納得さえすればそれで終わりなんだからさ
それなのにこの質問者は>>157についてはノーコメントなんだよ

166 名前:デフォルトの名無しさん mailto:sage [2016/12/01(木) 23:10:33.41 ID:O3rxu16z.net]
本気で質問しているようにも見えなかったが「できませんか」と訊かれているのだから
まず「出来ません」と回答しないと>>156は納得しないのではないだろうか。
可否がはっきりしない状態で質問通りでない代替案に誘導したらお題改変と罵られても致し方ない

167 名前:デフォルトの名無しさん mailto:sage [2016/12/01(木) 23:22:29.15 ID:O+yJrb2h.net]
おまえなー、それなー
いいかげんにしろよな
お前、俺に>>164で何て言った?

168 名前:デフォルトの名無しさん [2016/12/01(木) 23:42:50.11 ID:SwKXepyG.net]
min(x,y)とmax(x,y)の定義がマクロ版とテンプレート版が混在して悶絶した経験のある人だけが石を投げなさい。

169 名前:デフォルトの名無しさん mailto:sage [2016/12/01(木) 23:46:56.05 ID:rFASmZLg.net]
マクロ版min,maxは消せるけど

170 名前:デフォルトの名無しさん mailto:sage [2016/12/02(金) 00:39:59.68 ID:pucVjZc7.net]
質問です。
ideone.com/R8pyc7
配列と要素数を受け取るクラスにvectorを渡したい時のスマートな方法を教えて下さい。



171 名前:デフォルトの名無しさん mailto:sage [2016/12/02(金) 00:46:20.74 ID:xqmmn7KF.net]
vectorが変更しないならそれでいいだろうけど
そのコードみたいにpush_backするならhogeクラスには渡したくない
素直に考えるならvectorごと渡すクラスにすべきだが・・・

172 名前:デフォルトの名無しさん mailto:sage [2016/12/02(金) 00:56:10.11 ID:vQsfzK7a.net]
>>156
>"hogeの定義の方"をなんとかしてできませんか
はできないからあきらめれよ!ってこと?

173 名前:デフォルトの名無しさん mailto:sage [2016/12/02(金) 01:11:57.66 ID:EkOvBjK1.net]
>>170
ideone.com/bdR6fU

これでいいじゃん

constの参照だと参照を握ったままになるから常に反映される

174 名前:デフォルトの名無しさん mailto:sage [2016/12/02(金) 01:17:41.14 ID:BG6OiKaZ.net]
既存のライブラリをそのまま使いたいのでクラスの変更はなしの方向でお願いします

ラムダ式でコピーコンストラクタを呼ぶ方法がいいのかな
ideone.com/R8pyc7

175 名前:デフォルトの名無しさん mailto:sage [2016/12/02(金) 01:46:59.92 ID:bQI5jx4o.net]
この状況だとvectorを直接からめた時点でスマートじゃなくなるだろ
unique_ptrとか補助に使ってnew[]で確保した領域に値をコピーして渡すのが結局スマート(賢い)

176 名前:デフォルトの名無しさん mailto:sage [2016/12/02(金) 01:50:25.88 ID:FOrSERG0.net]
vector用のオーバーロード作ればいいんじゃないのか

177 名前:デフォルトの名無しさん mailto:sage [2016/12/02(金) 01:59:15.75 ID:EkOvBjK1.net]
>>174
size()を使ってる点でおかしいよ
vectorのインスタンスを無視するつもりか

178 名前:デフォルトの名無しさん [2016/12/02(金) 02:33:56.52 ID:kfHVwGjq.net]
>>177
君は間違っている。
STLでも begin() と end() で範囲指定するだろ。
イテレータがない型にも対応しようと思えば、先頭ポインタとサイズを渡すのが正しい。

179 名前:デフォルトの名無しさん mailto:sage [2016/12/02(金) 02:49:25.45 ID:l8IxU+t8.net]
クラス変更無しでvector渡したいなら、ラッパを作って
配列と要素数を更新してからメソッド呼ぶようにするしかないんじゃないかな?

180 名前:デフォルトの名無しさん [2016/12/02(金) 05:46:11.27 ID:na0ypgqO.net]
何が問題でどうしたいのか明確にしてないからこんな風にとっちらかった回答になるんだよな



181 名前:デフォルトの名無しさん mailto:sage [2016/12/02(金) 07:22:37.66 ID:nGP8T2R9.net]
質問者本人はこれ以上無いくらいに明確にしたつもり

182 名前:デフォルトの名無しさん [2016/12/02(金) 07:57:25.48 ID:na0ypgqO.net]
>>181
本人?
意図不明なラムダ使った未定義動作のコードで明確にしたつもりって言われてもなあ

183 名前:デフォルトの名無しさん mailto:sage [2016/12/02(金) 08:20:31.67 ID:4/nN0nxx.net]
明確でないならスルーしとけばいい
明確でないから自分の都合で改編するとか迷惑なだけ

184 名前:デフォルトの名無しさん mailto:sage [2016/12/02(金) 09:56:01.01 ID:tdlBqAAM.net]
>>174
連続格納が保証されてるのだから
&a[0]を渡せばいいよ

185 名前:デフォルトの名無しさん [2016/12/02(金) 10:09:51.51 ID:HWcr/nXn.net]
そもそもの基本
◎ int* に vector<int> は渡せない
相手が int* でビルトイン[]演算子を使う限り、
vector ではなく生の配列を用意する以外に選択肢はない

186 名前:デフォルトの名無しさん [2016/12/02(金) 10:30:03.38 ID:na0ypgqO.net]
明確にしたとしても
>>185
みたいに何も解ってない初心者がでしゃばって見当違いな回答する事も多かったな

187 名前:デフォルトの名無しさん [2016/12/02(金) 10:53:45.98 ID:HWcr/nXn.net]
そもそもの基本を指摘されて発狂するようなガイキチが暴れてただけだろ

188 名前:デフォルトの名無しさん mailto:sage [2016/12/02(金) 10:59:49.79 ID:dQ26sSxp.net]
>>170
ラッパーかヘルパーを用意して、vectorはそっちで処理する。

189 名前:デフォルトの名無しさん [2016/12/02(金) 11:04:51.34 ID:na0ypgqO.net]
>>187
お前は何のためにstd::vector<T>::dataがT*を返すと思ってんの?

190 名前:デフォルトの名無しさん [2016/12/02(金) 12:06:38.84 ID:kfHVwGjq.net]
vector::data()が追加されたのはC++11 からだから古い入門書には載ってない。
だから安易にdata()を使えと回答する人もまた入門者に近しい。



191 名前:デフォルトの名無しさん mailto:sage [2016/12/02(金) 12:12:12.15 ID:jbEu1BDa.net]
どうも論理が飛躍しているな

192 名前:デフォルトの名無しさん mailto:sage [2016/12/02(金) 12:28:12.29 ID:7EcjjmS3.net]
質問者はラムダ使ってるんだからdata()使えるでしょ

193 名前:デフォルトの名無しさん mailto:sage [2016/12/02(金) 12:29:35.07 ID:dQ26sSxp.net]
>>190
古い入門書を想定しろ、はさすがに言いがかりがひどすぎる。

194 名前:デフォルトの名無しさん mailto:sage [2016/12/02(金) 12:36:41.22 ID:oWLJBZXg.net]
AnsiString::data()のパクリか…

195 名前:デフォルトの名無しさん mailto:sage [2016/12/02(金) 12:38:30.29 ID:oWLJBZXg.net]
いや、string::data()か

196 名前:デフォルトの名無しさん mailto:sage [2016/12/02(金) 14:14:03.78 ID:uzv70fAD.net]
data()はいいけど、vectorにemplace_back()したらsize()も変化するんだが
それが渡したクラスでは反映されないってのが問題だと思ってたんだが勘違い?

197 名前:デフォルトの名無しさん mailto:sage [2016/12/02(金) 14:59:13.58 ID:7EcjjmS3.net]
俺もそう思ってた
もっといえば要素増やすとdata()の場所がかわってアクセス違反になるかもしれなくて困ると言うことかと

198 名前:デフォルトの名無しさん mailto:sage [2016/12/02(金) 15:03:09.14 ID:uzv70fAD.net]
>>197
あーそれはあるね
どんどん要素を増やして行くと再newしてそこに全部要素コピーされなおして
元のアドレスは無効になるってのがあったな
だからvectorをメンバに持つのを頑なに拒否する理由がわからない

199 名前:デフォルトの名無しさん [2016/12/02(金) 15:13:55.45 ID:kfHVwGjq.net]
なんだか急にスレのレベルが落ちたのはなぜ?
他の場所で使うためのvectorをメンバ変数にするとか勝手なこと言いだしているし、精神病っぽいんだが。






[ 新着レスの取得/表示 (agate) ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧](*・∀・)<56KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef