2ちゃんねる スマホ用 ■掲示板に戻る■ 全部 1- 最新50    

■ このスレッドは過去ログ倉庫に格納されています

C++相談室 part146

1 :デフォルトの名無しさん:2019/11/07(木) 11:35:36.76 ID:4wggfTwe.net
C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレにお願いします。

前スレ
C++相談室 part145
http://mevius.5ch.net/test/read.cgi/tech/1568362404/

このスレもよろしくね。
【初心者歓迎】C/C++室 Ver.105【環境依存OK】
http://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/ (日本語)

952 :デフォルトの名無しさん:2019/12/15(日) 21:24:07.01 ID:tmrMX5L5.net
質問ですが構造体Fooの内側に構造体Barが定義されているという入れ子になった構造体において、
Fooの外のコードでFoo::Barのサイズをsizeof()で知りたいとき、以下は正しい?
1. C++だとsizeof(Foo::Bar)と書いたらおk
2. CまたはC++でもC互換構文の範疇で済ます場合、次のどちらかの方法でしか書けない
(1) Foo::Barのインスタンスyが存在するスコープ内で、sizeof(y)と書く
(2) Fooのインスタンスxが存在するスコープ内において、Foo::Bar型のメンバyをFooが持つ
    (Foo::yが定義されている)という条件の下で、sizeof(x.y)と書く

953 :デフォルトの名無しさん:2019/12/15(日) 21:39:08.56 ID:tmrMX5L5.net
ふとオモタがインスタンスの必要性は無くせるかもしれん
Foo::Bar型のメンバFoo::yが定義さえされておれば、Fooのインスタンスが無くても
 sizeof(((Foo*)0)->y)
と書けばC言語で逝けるかもしれん…
スゲー気持ち悪いコードだが、、、、

954 :デフォルトの名無しさん:2019/12/15(日) 21:46:34.52 ID:PfQY9kAx.net
>>951
あくまでコンパイル時の型で決まるだけだから要注意
例えば

class A;
class B : public A;

A* p = new B();
std::shared_ptr<A> a(p);

これだとBのデストラクタは呼ばれない

955 :デフォルトの名無しさん:2019/12/15(日) 21:48:17.68 ID:5sPbacoo.net
なんでそんな中途半端な機能を
わざわざコストをかけて入れたんだろう

956 :デフォルトの名無しさん:2019/12/15(日) 21:49:32.31 ID:5sPbacoo.net
やむを得ず
なんだろうけど

957 :デフォルトの名無しさん:2019/12/15(日) 21:51:55.29 ID:PfQY9kAx.net
>>953
Linuxカーネルとかそういう感じのマクロ満載だよ
C言語はそういうもん

958 :デフォルトの名無しさん:2019/12/15(日) 22:05:12.60 ID:TeOOTcIs.net
type erasureと相性悪いんだっけ

959 :はちみつ餃子 :2019/12/15(日) 22:15:04.90 ID:jthcUe0A.net
>>943
思い出した。
gcc や clang の拡張で良ければ複文が式になる。
だいぶん昔からある機能。

#include <vector>
#include <iostream>

int main() {
std::vector<int> foo(({int i; for(i=0; i<3; i++); i;}));
std::cout << foo.size() << std::endl;
return 0;
}

960 ::2019/12/16(月) 19:39:21.34 ID:NZyGx79l.net
>>944,945,948,959
コメントありがとうございます!

>>944,959
まずgcc拡張
>SieveDerived(int n) : Sieve<T>(({int r; while((r = index(n)) == 0) n--; r;})) { } /* HERE!! */
で問題なく動作しました
すでにgcc拡張で存在するところからみて、私の希望はあながち無謀かつ無稽なものではないことを知りほっとしました
次にラムダ式で定義して即評価する方法がみつかりました
>SieveDerived(int n) : Sieve<T>([](int n)->int{int r; while ((r = index(n)) == 0) n--; return r;}(n)) { } /* HERE!! */
これがやりたかった!とても満足しています、ありがとうございました!
今までは関数オブジェクトの糖衣構文としてしかみていなかったラムダ式を、自分の希望にあわせて(あるいはねじまげてでも)採用し、表現できるようになったのは一歩理解が深まったかと考えています

>>948
>初期化リストの中にそんなごちゃごちゃしたこと書きたい?
クラスのメソッド=メンバ関数には、クラスの提供する機能として独立性の高いもの、少なくとも二箇所で同じような処理がダブっているもの、あるいは主観的には「lemma」として成り立つものを書きたいと考えていました
一箇所でしか使わないものでも lemma 性があるのならば private メソッドとして書くのもありかと思っていますが、今回の場合は、他におなじような処理をおこなっている場所はなく、かといってメソッドとして立てるほどのことでもないので、
複数個所からコールできるメソッドにはしたくなかった、という主観がありました、そういう性質の記述ならば初期化リストにごちゃごちゃ書くのもありかと、読み手には他からコールされ得ないことが自明である点からしても

https://ideone.com/y3ROXS

961 :デフォルトの名無しさん:2019/12/16(月) 20:14:24.13 ID:89loOkbp.net
まあこういう自己満は通過儀礼だよな

962 :デフォルトの名無しさん:2019/12/16(月) 21:46:21.90 ID:kSgVv2yp.net
lambdaの即時評価はjsだと多用されているイメージ
ブロックスコープないからね

963 :はちみつ餃子 :2019/12/17(火) 00:52:53.01 ID:0JRJucIS.net
>>960
> すでにgcc拡張で存在するところからみて、私の希望はあながち無謀かつ無稽なものではないことを知りほっとしました

30 年以上の実績があってもなお仕様に入らない程度に駄目なんだよ。

964 :デフォルトの名無しさん:2019/12/17(火) 03:23:09 ID:JQ5aWxOy.net
プライベートメンバの単体テストってみんなどうしてるのかな。

965 :デフォルトの名無しさん:2019/12/17(火) 03:30:02 ID:nsTCJN+n.net
#define private public

966 :デフォルトの名無しさん:2019/12/17(火) 03:58:13.47 ID:KUtZUPl9.net
#if 0
friend test;
#endif

967 :デフォルトの名無しさん:2019/12/17(火) 07:08:07.08 ID:KzMqUd+t.net
#ifndef NDEBUG
friend struct test;
#endif

968 :デフォルトの名無しさん:2019/12/17(火) 07:46:15.26 ID:wpWnXFFo.net
闇言語

969 :デフォルトの名無しさん:2019/12/17(火) 11:20:07.09 ID:dc1/89bE.net
namespace Method{ namespace Detail {
template<typename ReturnType, typename ... ArgTypes> struct MethodRegister{};
} }
// 文字列で呼び出すための関数を登録するためのマクロ
#define METHOD_REGISTER_WITH_NAME( NAME, FUNC, RETURNTYPE, ... ) \
namespace Method { namespace Detail { \
template<> struct MethodRegister<RETURNTYPE, __VA_ARGS__> { \
using Functional = std::function<RETURNTYPE(__VA_ARGS__)>; \
MethodRegister() { \
MethodContainer::GetInstance().Register<RETURNTYPE, __VA_ARGS__>( #FUNC, Functional( static_cast<RETURNTYPE(*)( __VA_ARGS__ )>( FUNC ) ) ); \
} \
~MethodRegister() { \
MethodContainer::GetInstance().Unregister( #FUNC ); \
} \
}; \
static MethodRegister<RETURNTYPE, __VA_ARGS__> sMethodRegister##FUNC; \
} }
void HOGE(){
std::cout << "Hello World!" << std::endl;
}
void HOGE( std::string text ){
std::cout << text << std::endl;
}
METHOD_REGISTER_METHOD( HOGE, void );
METHOD_REGISTER_METHOD( HOGE, void, std::string );

こういった形で関数を登録する用のクラスを生成し、変数として生成して管理の自動化を行いたいのですが、
関数のオーバーロードを対応しようとした所、クラスの再定義や変数の再定義、管理クラスへの重複登録等
多数の問題が出て詰まってしまいました。
こういった問題を対処するにはどうすればよいのでしょうか?

970 :デフォルトの名無しさん:2019/12/17(火) 11:28:10.65 ID:rApV4krM.net
BOOST

971 :デフォルトの名無しさん:2019/12/17(火) 12:23:52.67 ID:lfJGbKnI.net
>>966
>>967
リリース時に消す必要あんの?

972 :デフォルトの名無しさん:2019/12/17(火) 18:42:08.59 ID:iYSb7MEE.net
このへんがいいんでないの。
https://srz-zumix.blogspot.com/2015/06/c-private.html

973 ::2019/12/17(火) 19:10:07.01 ID:780pCLgH.net
>>963
まあ、
({int r; while((r = index(n)) == 0) n--; r;})
の最後の
r;
というのが限りなく非文法的ですし

974 :デフォルトの名無しさん:2019/12/17(火) 21:19:56.70 ID:r3fDxRx7.net
プライベートメンバをテストしたくなったらそのロジックのみを非メンバ関数に切り出してテストしてるな。
まぁ、特に支障がなければ単純にpublicにするだけの時もあるけど。

975 :デフォルトの名無しさん:2019/12/17(火) 21:45:39.29 ID:HvtzVY9o.net
templateでアクセスすると合法的にプライベートメンバにアクセスできる

976 :デフォルトの名無しさん:2019/12/17(火) 21:49:21.80 ID:iYSb7MEE.net
そんな糞な方法でテストなんかしたくねー。

977 :デフォルトの名無しさん:2019/12/18(水) 01:14:03 ID:zSYbFuJ0.net
テストなんかお綺麗にする必要が無い

978 :デフォルトの名無しさん:2019/12/18(水) 06:18:11.97 ID:BbfJ/y//.net
テストのテストが必要になるような意味のわからないテストコードはアウト
テストコードは実行せずに人が読んで理解できなければいけない

979 :デフォルトの名無しさん:2019/12/18(水) 07:25:56.60 ID:ksLRDXXy.net
>>978
どんな感じか見せていただけないでしょうか。

980 :デフォルトの名無しさん:2019/12/18(水) 07:42:51.80 ID:PEFQbiIG.net
>>971
絶対必要でもないが
少なくともデバッグ用であることくらい
アピールしたい
//よりNDEBUGという特定ワードを使う点にも拘りがある

981 :デフォルトの名無しさん:2019/12/18(水) 07:48:17.80 ID:uFDqtnkl.net
>>979
例えばテストコードの中にループや条件分岐があるようなものはアウト

982 :デフォルトの名無しさん:2019/12/18(水) 11:33:15.65 ID:ksLRDXXy.net
ループは許してもらえませんか?
データの並びとか検査したいんで。
条件分岐はたぶんないと思います。

983 :デフォルトの名無しさん:2019/12/18(水) 12:41:59.93 ID:pXzQg2xI.net
原理主義にすぐ染まるやつw
ご苦労様

984 :デフォルトの名無しさん:2019/12/18(水) 13:15:29.66 ID:iEIErwam.net
テスト用にいろんな複雑なテストも入れてるけど
まずいのか?

985 :デフォルトの名無しさん:2019/12/18(水) 13:22:47.07 ID:AjekT9H/.net
Debugビルドしたら遅すぎて検証できなくて詰んだ

986 :デフォルトの名無しさん:2019/12/18(水) 13:34:17.71 ID:YQOjezK4.net
典型的な糞テストは、テスト対象の出力がハッシュや現在時刻などのような予測しづらいものに依存している場合に、
テストコードにテスト対象自体のロジックと似たものを書いてしまっているケースだな
原則的には、期待する出力は全てハードコードするのが正しい
難しいなら一度試しにテスト対象を実行して目視テストし、その結果をハードコードしたほうがマシ

987 :デフォルトの名無しさん:2019/12/18(水) 13:39:53.25 ID:iEIErwam.net
メカが絡むリアルタイム処理でそんな事出来るかよ

988 :デフォルトの名無しさん:2019/12/18(水) 15:13:38.33 ID:uFDqtnkl.net
>>982
Parameterized Testsがあれば十分じゃね?

989 :デフォルトの名無しさん:2019/12/18(水) 15:16:04.78 ID:uFDqtnkl.net
>>986
期待する出力をハードコードするから
テストで「○○以上であること」って書くこと無いよね?
こういうテストケースある?言い換えるとそういうマッチャーって必要?

990 :デフォルトの名無しさん:2019/12/18(水) 15:38:06.38 ID:AmwvkO78.net
次スレは

991 :デフォルトの名無しさん:2019/12/18(水) 16:59:26.54 ID:ksLRDXXy.net
よ。

992 :デフォルトの名無しさん:2019/12/18(水) 17:57:22.30 ID:uFDqtnkl.net
ほらよ

C++相談室 part147
https://mevius.5ch.net/test/read.cgi/tech/1576659413/

993 :デフォルトの名無しさん:2019/12/18(水) 20:28:47.90 ID:CdPazUY7.net
>>987
それはまた別の話
ここで言ってるのは単体テストレベルの話だぞ

994 :デフォルトの名無しさん:2019/12/18(水) 21:11:16.67 ID:LM1drZI+.net
クラスとかの勉強入る前にC言語でしっかり文字列処理出来るようになったほうがいい?

995 :蟻人間 :2019/12/18(水) 21:14:21.02 ID:Zo1XP656.net
>>995
strcpyなんて古い関数は21世紀では使えないぜ。std::stringでOK.

996 :デフォルトの名無しさん:2019/12/18(水) 21:14:35.04 ID:uFDqtnkl.net
C言語でしっかり文字列処理出来るようになったほうがいい? → いい
C++でC言語の文字列処理する? → しない

997 :デフォルトの名無しさん:2019/12/18(水) 21:16:04.08 ID:aoz4SWmd.net
>>987
逆にそういう不確定な部分とロジック部分を切り分けるのが単体テストの目的でもある。

998 :デフォルトの名無しさん:2019/12/18(水) 23:15:57.41 ID:cF9WM4jz.net
>>992

お前らコピー使うなムーブしろ

999 :デフォルトの名無しさん:2019/12/19(木) 00:00:58.14 ID:zX6m0cqE.net
単体テストはどんだけ単純でわかりやすいコードでテストパターンを網羅するかが肝
Google TestとかTest::MoreとかJUnit使ったらワカル

1000 :蟻人間 :2019/12/19(木) 00:08:57.93 ID:r6T/W91o.net
あれっ?

1001 :2ch.net投稿限界:Over 1000 Thread
2ch.netからのレス数が1000に到達しました。

総レス数 1001
248 KB
掲示板に戻る 全部 前100 次100 最新50
read.cgi ver 2014.07.20.01.SC 2014/07/20 D ★