C++相談室 part144

レス数が950を超えています。1000を超えると書き込みができなくなります。
2019/07/22(月) 13:18:35.52ID:gptRHpgT
C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレにお願いします。

前スレ
C++相談室 part143
https://mevius.5ch.net/test/read.cgi/tech/1560574313/

このスレもよろしくね。
【初心者歓迎】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/ (日本語)

----- テンプレ ここまで -----
883デフォルトの名無しさん
垢版 |
2019/09/08(日) 13:30:28.50ID:m+XQHtHp
コンパイル時ならテンプレート
実行時ならDBでも用意してcaseでも使え
884デフォルトの名無しさん
垢版 |
2019/09/08(日) 13:31:17.61ID:+erxyDXy
pythonのクラスなら可能
2019/09/08(日) 13:33:13.25ID:jesnwhA+
あるけど生成したインスタンスを静的に受けとるには生成されるクラスの種類がポリモーフィズムをとれないといけない
2019/09/08(日) 15:24:20.28ID:WYqdduYI
>>885
個人的には C++ にはそういう機能はないんではないかと思うんですが。
2019/09/08(日) 15:27:47.20ID:rbzdrKrZ
リフレクションのたぐいだと思うのだが、まだない。
2019/09/08(日) 15:37:22.01ID:ijKgjVtQ
選択肢になりうるクラスの共通の親を作れば
2019/09/08(日) 16:06:14.53ID:JVGfWN1Z
生成したいクラスのリストがあらかじめわかっていれば可能
2019/09/08(日) 16:07:33.58ID:rbzdrKrZ
decl_typeが文字列を受け付ければいいが、あれも静的に解決してそうだなぁ。
2019/09/08(日) 16:14:18.54ID:qEJgkL29
>>882
文字列とクラスの対応はtype_info::name()で与えられているが
文字列の形式が処理系定義であることに注意が必要
892デフォルトの名無しさん
垢版 |
2019/09/08(日) 16:23:33.90ID:m+XQHtHp
>>886
その通りだが
自分で規定を作ってしまえ良い
全てのクラスを単一のメタクラスから派生するルールで統一汁
2019/09/08(日) 16:25:39.30ID:rbzdrKrZ
Typeを保持するタイプが欲しいわ。。

type t=int;

的な。
2019/09/08(日) 16:29:08.94ID:x7//igd4
実行時に文字列で指定したいのかソースコードレベルの話なのかわかんねえ
2019/09/08(日) 16:39:53.43ID:x7//igd4
共通の親クラス持たせてmapのキー文字列にして生成用の関数ぶっこめばいいけど
親クラスが共通じゃない場合は難しいのかな
2019/09/08(日) 16:48:58.23ID:ijKgjVtQ
全クラスに対応する必要なんてないんだったらこんな感じでいいんじゃないか
enum ClassName{
Hoge,
Hige,
Hage
}
std::any func(ClassName name){
std::any out;
switch(name){
case ClassName::Hoge:
out = new Hoge();
break;
case ClassName::Hige:
out = new Hige();
break;
case ClassName::Hage:
out = new Hage();
break;
}
return out;}

int main(){
//なんか文字列を受け取る
ClassName name;
//文字列をClassNameに変換する
auto fuga = func(name);
if(fuga.type() = typeid(Hoge*)){
auto hoge = std::any_cast<Hoge*>(fuga);
//hogeの処理
} else if 以下略
}
2019/09/08(日) 17:24:35.33ID:qEJgkL29
全クラスをユーザーが把握している必要があるなんてクソ設計だな
2019/09/08(日) 17:52:15.72ID:aYvF75oN
なぜAbstractFactoryパターンを使わないのか
2019/09/08(日) 17:58:58.65ID:qEJgkL29
>>882
GUIDで指定したクラスのインスタンスを生成する方法なら
COMのCoCreateInstance()がそれだが参考になるか?

ユニークでなければならないクラス名を文字列で指定はかなりキツいという意味で
2019/09/08(日) 18:29:25.64ID:46Wp6heU
vtableでなんとかならんの?
901882です。
垢版 |
2019/09/08(日) 21:55:34.48ID:8BL9REyc
必要な情報が色々と抜けていたのに、色々と情報をいただきありがとうございます。
私が考えていたのは実行時に型を登録するようなクラスを使う方法です。
仮コードですが下記のような感じです。
template<typename BaseType> class InheritanceContainer{
struct IInheritance{
// BaseTypeを継承したクラスを生成
virtual BaseType* Create() const = 0;
};
template<typename Type> struct Inheritance : public IInheritance{
virtual BaseType* Create() const{ return static_cast<BaseType*>( new Type() ); }
};
public:
// 型情報の登録
template<typename Type> bool Add(){
std::unordered_map<std::string, IInheritance*>::iterator it = m_InheritanceMap.find( ctti::nameof<Type>().cppstring() ); // ctti::nameof<Type>().cppstring() cttiライブラリーを利用して型の文字列を取得する
if( it != m_InheritanceMap.end() ) return;
m_InheritanceMap.insert( std::make_pair( ctti::nameof<Type>().cppstring(), new Inheritance<Type>() ) );
}
// 文字列に合わせた BaseType を継承した物を生成
BaseType* Create( const std::string& _TypeText ){
std::unordered_map<std::string, IInheritance*>::iterator it = m_InheritanceMap.find( _TypeText );
return it != m_InheritanceMap.end() ? it->second->Create() : NULL;
}
private:
std::unordered_map<std::string, IInheritance*> m_InheritanceMap;
};
一応これでも要件は満たしているのですが、
いかんせんこれだと使うクラスを予め手動で登録している必要があり、
保守管理が手間なので皆様のお知恵を拝借できればと思い質問した次第です。
頂いた情報はこれから勉強します。
2019/09/08(日) 23:12:54.90ID:35vt5+A/
C++なんだしnullptr使ってこうぜ
2019/09/09(月) 00:06:19.70ID:9HmBuaOU
基本的な事なのですが教えてください。
memcpy可能なクラス若しくは構造体はどうやって判定するのがスマートですか?
2019/09/09(月) 00:11:49.05ID:PN/XD42X
>>903
使う必要ないでしょ
Cと違うよ
2019/09/09(月) 00:22:36.87ID:9HmBuaOU
>>904
1から作られればそうするのですが、c言語のベースがあって、それをコピペでc++で改修して、そいつの改造なんでどうしても必要なんですよ。
手を出せない共通処理がmemcpyを使ってるから、チェック処理が必要だったので
2019/09/09(月) 00:23:34.34ID:gU/0Tin3
>>903
自分で解析するかコード書いた人に保証してもらうしかないと思うよ。
基本型だからコピーしても大丈夫と思ったら参照カウンタとして使われていた、なんてこともあるだろうし
2019/09/09(月) 00:30:39.85ID:cBWmqiWb
std::is_trivially_copyableとか?
2019/09/09(月) 00:44:58.27ID:k7L7RTJv
C互換ということならstd::is_podがいいのかな
2019/09/09(月) 02:56:10.10ID:L8mIN3PD
std::is_pod とかってどうやって実装されてるんだろう。
コンパイラのビルトイン? それとも template で作られてる?
2019/09/09(月) 03:00:19.03ID:MF4WMKe5
constexprでは
2019/09/09(月) 03:50:37.41ID:9JOMxNeV
type_traitsはだいたいビルトインでしょ
コンパイラは知ってるはずの情報なんだから変なトリックコードで取る必要もない
2019/09/09(月) 06:48:32.63ID:qT2kJ6NO
>>911
こちらでどうぞ
https://mevius.5ch.net/test/read.cgi/tech/1427572389/
913909
垢版 |
2019/09/09(月) 12:06:40.11ID:L8mIN3PD
>>911
自分で調査してみたところ、以下の様に、あなたのおっしゃるとおり、
中核部分は、__is_pod(クラス名) という「ビルトイン関数」を使っていました:


 // Could use is_standard_layout && is_trivial instead of the builtin.
 template<typename _Tp>
  struct is_pod
  : public integral_constant<bool, __is_pod(_Tp)>
  { };

 /// integral_constant
 template<typename _Tp, _Tp __v>
  struct integral_constant
  {
   static constexpr _Tp         value = __v;
   typedef _Tp              value_type;
   typedef integral_constant<_Tp, __v>  type;
   constexpr operator value_type() const noexcept { return value; }
#if __cplusplus > 201103L
#define __cpp_lib_integral_constant_callable 201304
   constexpr value_type operator()() const noexcept { return value; }
#endif
  };
2019/09/09(月) 12:31:11.05ID:BaqZzWRe
QTとElectronどっちが優れてますか?
2019/09/09(月) 12:34:21.95ID:L8mIN3PD
>>914
単純にQtだと思うが。
2019/09/09(月) 13:01:23.17ID:a6mWw99g
小学生のどっちが強い議論かよ
917デフォルトの名無しさん
垢版 |
2019/09/09(月) 13:14:59.70ID:By40c52C
>>901
pythonのPyObjectのコード観てみ
2019/09/09(月) 13:38:51.72ID:BaqZzWRe
>>915
ありがとうございます
>>916
神になる方法が知りたくて‥
919デフォルトの名無しさん
垢版 |
2019/09/09(月) 13:41:26.48ID:FLVXg6p/
tk > wxWidgets > Qt > electron
920デフォルトの名無しさん
垢版 |
2019/09/09(月) 14:33:07.01ID:dQ/pGf2B
stringstreamで

std::stringstream ss;
ss << value;
std::string str = ss.str();

こんな感じで数値を文字列に変換すると、valueが3桁以上だった場合
12,000みたいな感じで勝手にカンマがついてしまうんだけど
カンマがつかないフォーマットで出力する方法を教えてください
2019/09/09(月) 14:53:29.86ID:KKylx/uA
なんかロケールがアレなんじゃ
2019/09/09(月) 15:32:31.63ID:qT2kJ6NO
普通、コンマは付かんだろ
https://ideone.com/L7hohk
2019/09/09(月) 15:38:54.81ID:pmQvKTaB
もしかして。 っ浮動小数点のドット
2019/09/09(月) 16:22:41.31ID:XEtSQUcF
ss.imbue(std::locale("C"));
でもしてみりゃいいんじゃね
925デフォルトの名無しさん
垢版 |
2019/09/09(月) 17:01:25.39ID:dQ/pGf2B
ロケールの設定が原因でした
wstringで日本語を扱いたくて
std::locale::global( std::locale( "japanese" ) );
std::setlocale( LC_ALL, "japanese" );
ってやるとstringstreamでカンマが付くなんて知らなかった
2019/09/09(月) 17:05:42.93ID:L8mIN3PD
std::list<int> l = { 7, 5, 16, 8 };

とすると、 l というリスト右辺で指定した要素で初期化した状態で作成されますが、
このときの std::list 自体の実装方法が知りたいです。
最新の C++ の方法論(?)によれば、右辺がコンパイラによって initiailer_list に
なって、list のコンストラクタにそれが仮引数の型として宣言してあるものがあって、
そこで処理しているのかと思い、確認のため、

http://cs.brown.edu/people/jwicks/libstdc++/html_user/stl__list_8h-source.html

で、std::list のソースを見てみると、initiailer_list というキーワードが見つかりません。
ではいったいどういう仕組みで初期化しているのでしょうか。
operator=() は見つかります。
927デフォルトの名無しさん
垢版 |
2019/09/09(月) 17:07:18.30ID:G9jMTORL
>>926
誤:とすると、 l というリスト右辺で指定した要素で初期化した状態で作成されますが、
正:とすると、 l というリストが右辺で指定した要素で初期化した状態で作成されますが、

誤:initiailer_list
正:initializer_list
2019/09/09(月) 17:12:55.99ID:MF4WMKe5
<list> を見よう
2019/09/09(月) 17:20:40.83ID:MF4WMKe5
>>926
一応マジレスしておくと、そのサイトの一番下を見よう
> Generated on Fri May 6 01:09:09 2005 for libstdc++-v3
initializer_listが導入されたのはC++11だからね
2019/09/09(月) 17:28:46.68ID:pmQvKTaB
stl_list.hなんてコードは標準にはありません。

リンクドリストのよくあると思われる実装は、
struct node{
node* next=nullptr;
node* prev=nullptr;
T value();
}

という構造体の操作等をクラス化したモノ。
なので、インデックサが無いはずである。
2019/09/09(月) 17:32:18.21ID:pmQvKTaB
あ、蛇足だった。。。
2019/09/09(月) 18:26:49.77ID:L8mIN3PD
VC2019 の list ヘッダではちゃんと見つかりました。
みなさんありがとうございました。
2019/09/09(月) 18:33:38.13ID:G9jMTORL
また質問させてください。
VS2019 の tuple の実装を調べていて、utility というヘッダファイルに以下の
ようなコードを見つけました。自分の直感では、これは、パターンマッチングを
していると思うんですが、実は、以下の (1) にマッチングする場合、
(2) にもマッチングする場合があります。しかし、現実には (1) にマッチングする
場合には、コンパイラは (2) を無視して (1) だけを採用する必要があると
思うんですが、template には、マッチングに優先順位があって、定義した
順にマッチングするかを調べて、一番最初にマッチングしたものを採用して
それ以後のものは無視すると言うような規則があるのでしょうか?

// (1)
template <class _This, class... _Rest>
struct _Tuple_element<_This, tuple<_This, _Rest...>> { // select first element
  using _Check_type = int;
  static_assert(
    is_void_v<typename _Tuple_element<_This, tuple<_Rest...>>::_Check_type>, "duplicate type T in get<T>(tuple)");

  using type  = _This;
  using _Ttype = tuple<_This, _Rest...>;
};

// (2)
template <class _Ty, class _This, class... _Rest>
struct _Tuple_element<_Ty, tuple<_This, _Rest...>>
  : _Tuple_element<_Ty, tuple<_Rest...>> { // recursive _Tuple_element definition
};
2019/09/09(月) 19:26:19.32ID:L8mIN3PD
>>933
なお、_Tuple_element は、

tuple tpl;

に対し、get<番号>(tpl) としたときに呼び出される以下のコードから使われます。

結論的には、template を書いた順序ではなく、パターンマッチングおける強弱のような
もので優先順位が決まっているようです。それは丁度、同じ名前に仮引数の型だけが
異なる複数の関数 が overload 定義されている場合に、どの関数が呼び出されるかを
決めるときのアルゴリズムに似ているようです。詳しくは分かりません。


// FUNCTION TEMPLATE get (by type)
template <class _Ty,
  class... _Types>
_NODISCARD constexpr _Ty& get(tuple<_Types...>& _Tuple) noexcept { // get reference to _Ty element of tuple
  using _Ttype = typename _Tuple_element<_Ty, tuple<_Types...>>::_Ttype;
  return ((_Ttype&) _Tuple)._Myfirst._Val;
}
2019/09/09(月) 19:28:45.47ID:G9jMTORL
>>934
誤:get<番号>(tpl) としたときに呼び出される以下のコードから使われます。
正:get<型名>(tpl) としたときに呼び出される以下のコードから使われます。
2019/09/09(月) 21:43:26.98ID:jbm+gpsV
この辺の話?
https://ja.cppreference.com/w/cpp/language/partial_specialization#.E5.8D.8A.E9.A0.86.E5.BA.8F
2019/09/10(火) 01:40:29.13ID:wmYy4ZD0
>>934
ちなみに、C++ における tuple とは、異なる型のオブジェクトの集合体のような
もので、get<idx>(tpl) とすると idx 番目の要素が参照できます。
動的配列 vector、リンクリスト list は同じ型の集合体ですが、tupleは
char, int, string 任意の順番で任意個数入れたりするようなことが可能です。
tuple は class を次々に継承することで実現され、N個の要素の場合は、
(N - 1) 回継承されて実現されています。
get<idx>(tpl) は、コンパイル段階で静的に型が決まるようになっており、
idx を 1 ずつ減らしながら idxが0 になるまでtemplateを再帰的に具現化(展開)し
て行っています。その際、基本クラスへの「cast」を利用して上手く実装されています。
get<TYPE>(tpl) は、その TYPE 版で、tuple の中の TYPE 型の要素を取り出すもので、
TYPEの要素が一個だけであることを仮定しています。

>>934
using _Ttype = typename _Tuple_element<_Ty, tuple<_Types...>>::_Ttype;
  return ((_Ttype&) _Tuple)._Myfirst._Val;
の部分は、丁度 TYPE = _Ty の場合のもので _Tuple_element<_Ty, tuple<_Types...>>
の部分が、再帰的に template 具現化を使って _Ty の型の要素が先頭になるまで
tuple の要素を減らす処理を行っており、_Ttype には、その tuple の型が入ります。
次の return 文は、cast を行っている部分です。
>>933 の(2)は、再帰的に tuple の先頭の要素を除去して行くマクロで、(1)は、
tuple の先頭が _Type になった場合にマクロ展開の動作を停止するためのものです。
2019/09/10(火) 08:37:19.66ID:rSLGtoNV
recursive _Tuple_element definition って書いてあるから
>>933の(1)(2)併せてtupleのバッカス・ナウア記法
2019/09/10(火) 12:01:32.29ID:wmYy4ZD0
>>938
>>933 は単純な BNFとはかなり違うはず。
940デフォルトの名無しさん
垢版 |
2019/09/10(火) 17:10:53.21ID:BQ4j7tjI
C#には文字列で指定したメソッドを呼び出す方法がありますが、
C++ではそういった事をしたい場合、どういった方法があるのでしょうか?
941デフォルトの名無しさん
垢版 |
2019/09/10(火) 17:15:02.60ID:lKNyd4my
なんかこのスレだけ(っていうか特定のレスだけ?)貼られてるソースのフォントが微妙に違う気がするんだが気のせい?
2019/09/10(火) 17:15:39.36ID:H3vpu58u
関数ポインタ返せばいいんじゃね
2019/09/10(火) 17:15:56.86ID:H3vpu58u
>>940
944デフォルトの名無しさん
垢版 |
2019/09/10(火) 17:16:04.51ID:EA1WacFe
>>940
最近他のスレで同じ質問を観たけどマルチ?
2019/09/10(火) 17:16:07.43ID:cOE65+EF
mapファイルからシンボル探して関数呼ぶとか。
2019/09/10(火) 17:58:56.15ID:4IK1yyiH
>>941
専ブラ使ってるならAA表示をオフれ
2019/09/10(火) 18:30:27.12ID:/IdzRyhX
mapに入れるにしても呼び出す関数の引数戻り値の型が一致してる必要があるくね
948デフォルトの名無しさん
垢版 |
2019/09/10(火) 18:36:26.12ID:lKNyd4my
>>946
なるほど
何が引っかかってるんだろ
>> とか << が多い程度じゃ判別されないはずだが
2019/09/10(火) 21:34:14.67ID:ihR0gUx6
>>940
関数名の文字列ではなく、関数ポインタを使えばやりたいことができる可能性は高い。
または仮想関数。
2019/09/10(火) 21:51:01.01ID:ER41jhKS
C++は名前と引数が同じで戻り値が違うくらいでは別物として扱ってくれない。
ドットネットだと大丈夫だった気がする。
2019/09/10(火) 21:57:04.55ID:7WGaos5g
嘘つけ
2019/09/10(火) 22:21:19.85ID:ER41jhKS
https://ideone.com/0A6NGs
こんなコード書いてみた。やはり戻り値を推定して関数分けてもらえない。
factory<int>の<int>を消したい。
2019/09/10(火) 22:21:47.33ID:ER41jhKS
>>951
うろ覚えだから、間違ってたらそーりー。
2019/09/10(火) 22:26:46.90ID:DP4nYdpK
んなめんどいことせんでも関数2つぐらい作って関数ポインタの配列に入れりゃいいだけだろ
2019/09/10(火) 22:28:02.41ID:ER41jhKS
>>954
後学のために、コードみたいわ〜。
2019/09/11(水) 00:05:28.08ID:NNlDJcv1
>>944
俺が見たのは、文字列からクラスのインスタンス作りたいだったから微妙に違う
2019/09/11(水) 00:34:09.53ID:jCX5Zmm7
まあそれ用のレイヤ噛ますのが素直だよね
.netみたいなのがあればそれでいいし、CのGLibみたいなのもちょっと無理を感じなくもないがアリ
2019/09/11(水) 01:04:41.71ID:Au6CJXG/
>>953
昔のC++では、確かに戻り値の型は同名関数の絞込みには使用されなかったよ。
今は知らない。
2019/09/11(水) 01:17:18.25ID:xNhcwpCp
戻り値だけ違う関数を作りたきゃテンプレートを使え
以上
2019/09/11(水) 01:57:43.22ID:TkJgDVYV
TypeHolderTypeがほしい。
リフレクションは23で入るそうな。
2019/09/11(水) 07:00:09.68ID:KrQUVjgm
>>952
AからRを推定させたいっていことか?
2019/09/11(水) 08:37:00.29ID:BcUfEF7y
リフレクションどうやって実装するんだろう・・
現行のC/C++とリンカの仕様と互換性たもったまま実装するのかなり難しそうだけど
2019/09/11(水) 10:13:16.97ID:px+Xr7os
C++に不可能は無い
2019/09/11(水) 10:17:36.03ID:4wA+sXag
>>963
不可能はあるよ
バカにC++を理解するのは不可能
2019/09/11(水) 11:21:58.81ID:9WrJeA7f
structured bindingで定義した変数をラムダ式でキャプチャするとclang7はエラー、gcc7は通る。
いずれもc++17指定。
使用上正しいのはどっち?

const auto [a,b]=std::make_tuple(1.0,0.0);
auto f=[&](){
return a+b;
};
2019/09/11(水) 11:39:01.09ID:KrQUVjgm
>>965
clangが正しい
N4713 8.5.4.2 Capturesの段落8にこう書いてある
If a lambda-expression explicitly captures an entity that is not odr-usable or captures a structured binding (explicitly or implicitly), the program is
ill-formed.
2019/09/11(水) 11:49:32.96ID:9WrJeA7f
>>966
ありがと
この仕様の真意が理解できないが、そういう仕様では仕方ないな…
2019/09/11(水) 12:07:20.16ID:KrQUVjgm
理由は俺もよくわからん
2019/09/11(水) 12:13:22.75ID:9+CD8w/u
ちなみに [a,b] は、std::tie(a,b) と書くのと同じですか?
また、[a,b] はなんという名称(概念)ですか?
2019/09/11(水) 12:26:12.95ID:9+CD8w/u
>>969
自己レスですが、[a,b] は、これですか:
https://en.cppreference.com/w/cpp/language/structured_binding
↑Structured binding declaration (since C++17)

int a[2] = {1,2};
auto [x,y] = a; // creates e[2], copies a into e, then x refers to e[0], y refers to e[1]
auto& [xr, yr] = a; // xr refers to a[0], yr refers to a[1]
2019/09/11(水) 13:04:41.28ID:9WrJeA7f
>>969
tieでは事前に定義した変数に代入することになるじゃん
つーことはconst変数にできない
2019/09/11(水) 13:05:15.41ID:9WrJeA7f
>>970
それ
973デフォルトの名無しさん
垢版 |
2019/09/11(水) 13:05:17.06ID:zFEVPQj4
tieは良くないmaketuple使え
2019/09/11(水) 13:28:34.92ID:9WrJeA7f
>>973
ズレてるよ
2019/09/11(水) 13:46:37.79ID:TkJgDVYV
>>961
decltype(auto) f(){} ができればよいのだけどね。
2019/09/11(水) 20:20:32.38ID:jgB/KG+a
Aクラスを継承したテンプレートで型を指定したメンバー変数cを持つ、Bクラスがある。

BクラスをキャストしたAポインタ仮想メソッド使ってBのメンバー変数cを取得したいんだけど、ダウンキャストしかないかね?

class A{};

template<typename _T>
class B : pubulic A{ pubulic : _T c;}

A *a = new B<int>;

int ret = A->???;
2019/09/11(水) 20:23:28.97ID:xNhcwpCp
> A *a = new B<int>;

なぜ?
2019/09/11(水) 20:25:26.05ID:xNhcwpCp
BのインスタンスをAにアップキャストした時点でAにないメンバは破棄されるのでAのポインタからcにアクセスすることはできない
2019/09/11(水) 20:26:04.31ID:jgB/KG+a
いろんな型をリスト化する為です。
実際はAポインタの配列
2019/09/11(水) 20:29:39.70ID:TkJgDVYV
TypeHolderTypeがほしいのじゃーーーーー!!!
2019/09/11(水) 21:01:04.58ID:QpQ1AfFp
cにアクセスしたい人はBを知ってるんだから、ダウンキャストでもなんでもやりゃぁええがな。
2019/09/11(水) 21:04:08.52ID:k/thmV8R
variantなりanyなり使えば
レス数が950を超えています。1000を超えると書き込みができなくなります。